gpt4 book ai didi

python - 如何在 Python 中从子进程向 SSH 传递命令

转载 作者:行者123 更新时间:2023-11-28 18:23:56 25 4
gpt4 key购买 nike

我已经使用Python 2.7.6 中的subprocess 模块建立SSH。我意识到不推荐这样做,但我无法安装其他 Python SSH 库,例如 paramiko 和 fabric。

我只是想知道是否有人不介意告诉我现在该怎么做

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

我想使用子进程方法在 REMOTE 中执行命令。有什么办法吗?不幸的是,REMOTE 受用户手动输入的密码保护。如果有帮助,我正在运行 Windows 10 Bash shell。

感谢任何帮助。

最佳答案

运行远程命令就像将它放在命令行上一样简单。 (这在协议(protocol)级别与 SSH 服务器区别于在 stdin 上提供它,但所讨论的协议(protocol)是为编程使用而构建的,而不是为人类使用而构建的——因为后者是交互式 shell 模型背后的设计意图) .

顺便说一句,如果你想在仅验证一次后通过单个连接通过不同的 SSH 调用运行多个命令,我强烈建议为此使用 Paramiko,但你可以使用使用 SSH multiplexing support 的 OpenSSH 命令行工具.


假设您有一个代表远程命令的数组:

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])

因为我们没有重定向 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])

关于python - 如何在 Python 中从子进程向 SSH 传递命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42815060/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com