用于sudo命令的交互式远程密码输入不能与Paramiko一起使用

时间:2015-06-01 20:02:57

标签: linux ssh sudo paramiko

我试图想出一个例子,我尝试使用一个需要sudo权限的命令,并尝试使用Paramiko在远程服务器上执行它但是不成功。程序和错误消息在下面给出

ip = server_hostname
userName = user1
passWord = password1
command = 'sudo hostname'
ssh = paramiko.SSHClient()
ssh.load_system_host_keys()
ssh.connect(ip, username=userName, password=passWord, port=22)
stdin, stdout, stderr = ssh.exec_command(command)
stdin.write('password\n')
stdin.flush()
print stderr.readlines()

错误信息如下:

['sudo: no tty present and no askpass program specified\n']

sudo密码输入是否有我缺少的东西?

1 个答案:

答案 0 :(得分:0)

在授予密码输入方面,ssh似乎有些偏执。但实际上这种行为确实有意义。它试图通过远程控制ssh会话来防止错过使用。因此,ssh有两种策略可以要求输入密码:

  1. 必须为进程分配tty,或伪tty。换句话说:会话必须是交互式会话。没有这样的tty(终端),ssh应该从哪里询问密码?

  2. 必须设置DISPLAY环境变量并且" askpass"程序必须为ssh进程所知,通常在环境变量SSH_ASKPASS中指定。该值必须指向一个可执行文件,一个帮助程序,它允许以对密码等机密信息有意义的方式输入密码。每个系统通常都安装了这样的实用程序,通常是不同的环境,如普通的X,GNOME或KDE。在这种情况下,ssh将尝试在DISPLAY中使用该实用程序作为X应用程序来请求密码。

  3. 在你的情况下,两种情况都不存在。通常情况下,远程shell不是由交互式会话直接控制,并且远程端没有安装可以在给定X显示器上使用的askpass帮助程序。