运行远程命令与将其放在命令行上一样简单。 (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])
至少,你应该'区分'和''。你如何构建'COMMAND'也很重要,如果你用变量替代而不是运行一个不变的命令,那么手头就存在安全问题。 –
......你的标题说你的问题是“如何传递命令”,但是目前显然你不知道如何做的唯一部分是传递密码。你试图做的事情:形成远程命令来运行,以及如何失败,这很重要。 –
它也很重要 - 很多 - 关于您的Python程序是否从用户所在的TTY运行,并且能够交互式输入密码。 –