ent*_*ity 5 python ssh bash subprocess
我已经使用subprocessPython 2.7.6 中的模块来建立 SSH。我意识到不推荐这样做,但是我无法安装其他 Python SSH 库,例如 paramiko 和 fabric。
我只是想知道是否有人不介意告诉我我现在该怎么做
sshProcess = subprocess.call(['ssh', '-t', '<REMOTE>', 'ssh', '<REMOTE>'])
Run Code Online (Sandbox Code Playgroud)
我想REMOTE用子流程方法执行命令。有没有办法做到这一点?不幸的是,REMOTE受用户手动输入的密码保护。如果有帮助,我正在运行 Windows 10 Bash shell。
任何帮助表示赞赏。
运行远程命令就像将其放在命令行上一样简单。(这对于 SSH 服务器在协议级别上与在标准输入上提供数据是有区别的,但是所讨论的协议是为编程使用而构建的,而不是为人类使用而构建的——因为后者是交互式 shell 模型背后的设计意图) 。
顺便说一句,如果您想在仅进行一次身份验证后通过单个连接通过不同的 SSH 调用运行多个命令,我强烈建议使用 Paramiko 来实现此目的,但您可以通过使用SSH多路复用支持来使用 OpenSSH 命令行工具来完成此操作。
假设您有一个代表远程命令的数组:
myCommand = [ 'ls', '-l', '/tmp/my directory name with spaces' ]
Run Code Online (Sandbox Code Playgroud)
要将其放入字符串中(以尊重空格并且不能让恶意选择的名称在远程服务器上运行任意命令的方式),您可以使用:
myCommandStr = ' '.join(pipes.quote(n) for n in myCommand)
Run Code Online (Sandbox Code Playgroud)
现在,您可以将一些内容作为命令行参数传递给 ssh:
subprocess.call(['ssh', '-t', hostname, myCommandStr])
Run Code Online (Sandbox Code Playgroud)
但是,假设您想嵌套它。您只需重复该过程即可:
myCommand = [ 'ssh', '-t', hostname1, myCommandStr ]
myCommandStr = ' '.join(pipes.quote(n) for n in myCommand)
subprocess.call(['ssh', '-t', hostname2, myCommandStr])
Run Code Online (Sandbox Code Playgroud)
因为我们没有重定向 stdin 或 stdout,所以它们仍应指向启动 Python 程序的终端,因此 SSH 应该能够直接执行其密码提示。
也就是说,特别是对于通过临时系统进行 ssh 操作,您不需要经历这么多麻烦:您可以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])
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8100 次 |
| 最近记录: |