2017-03-15 49 views
2

我已经使用Python 2.7.6中的subprocess模块来建立SSH。我意识到这不是建议的,但我无法安装其他Python SSH库,如paramiko和fabric。如何将命令从Python中的子进程传递到SSH

我只是想知道,如果有人不介意只是告诉我,我怎么会现在去

sshProcess = subprocess.call(['ssh', '-t', '<REMOTE>', 'ssh', '<REMOTE>']) 

我要执行的命令在REMOTE与子方法。有没有办法做到这一点?不幸的是,REMOTE受用户手动输入的密码保护。如果有帮助,我正在运行Windows 10 Bash shell。

任何帮助表示赞赏。

+0

至少,你应该'区分'和''。你如何构建'COMMAND'也很重要,如果你用变量替代而不是运行一个不变的命令,那么手头就存在安全问题。 –

+0

......你的标题说你的问题是“如何传递命令”,但是目前显然你不知道如何做的唯一部分是传递密码。你试图做的事情:形成远程命令来运行,以及如何失败,这很重要。 –

+0

它也很重要 - 很多 - 关于您的Python程序是否从用户所在的TTY运行,并且能够交互式输入密码。 –

回答

1

运行远程命令与将其放在命令行上一样简单。 (SSH协议级别的SSH服务器可以区分SSH协议级别的服务器,但是所讨论的协议是为编程使用而构建的,VS是为人类使用而构建的,因为后者是交互式shell模型背后的设计意图) 。顺便说一句,如果你想通过一次连接在单一连接上运行多个不同的SSH调用,我强烈建议使用Paramiko来做这件事,但你可以用可以用OpenSSH命令行来做到这一点工具通过使用SSH multiplexing support


比方说,你有一个代表你的远程命令的数组:

myCommand = [ 'ls', '-l', '/tmp/my directory name with spaces' ] 

要获得成字符串(在荣誉的空间,不能让恶意选择的名称运行方式远程服务器)上任意的命令,你会使用:

myCommandStr = ' '.join(pipes.quote(n) for n in myCommand) 

现在,你有什么事情,你可以通过一个命令行参数的ssh:

subprocess.call(['ssh', '-t', hostname, myCommandStr]) 

但是,让我们说你想嵌套这个。您可以重复刚才的过程:

myCommand = [ 'ssh', '-t', hostname1, myCommandStr ] 
myCommandStr = ' '.join(pipes.quote(n) for n in myCommand) 
subprocess.call(['ssh', '-t', hostname2, myCommandStr]) 

,因为我们没有重定向标准输入和标准输出,仍应在从你的Python程序启动的终端指出,所以SSH应该能够执行其口令提示直。


这就是说,专门通过临时系统ssh'ing,你并不需要经过这么多的麻烦:你可以告诉ssh这样做对你的工作与ProxyJump选项:

myCommand = [ 'ls', '-l', '/tmp/my directory name with spaces' ] 
myCommandStr = ' '.join(pipes.quote(n) for n in myCommand) 
subprocess.call(['ssh', '-o', 'ProxyJump=%s' % hostname1, hostname2, myCommandStr]) 
0

从您的评论,你说你可以连接。所以在这之后,通过SSH使用的子进程,你会需要像交互:

ssh = subprocess.Popen(['ssh', <remote client>], 
          stdin=subprocess.PIPE, 
          stdout = subprocess.PIPE) 
back = ssh.stdout.readlines() 
if result == []: 
    error = ssh.stderr.readlines() 
    print error 
else: 
    print back 

然后发送命令,比如列出目录,是这样的:

ssh.stdin.write("ls\n") 
+0

'ssh.stdout.readlines()'将永远挂起,除非stdout关闭(在此之后,您将来无法阅读更多内容)。 –

+0

...此外,通过此路由意味着SSH进程不再具有TTY句柄(因为您使用管道重写了它),因此它不能直接提示输入密码。 –

+0

啊,是的,它会的,我会编辑 –

相关问题