1 回答

TA贡献1712条经验 获得超3个赞
这里实际上有三种选择:在进程中做某事(如paramiko
)、ssh
直接运行(使用subprocess
)和ssh
使用shell运行(也使用subprocess
)。作为一般规则,避免以编程方式运行 shell(而不是根据交互式用户请求)。
原因是它是一个以人为本的界面(因此很容易将单词与空格、快捷键$HOME
和通配符分开)作为 API 的功能大大不足。例如,考虑一下您的代码如何检测到ssh
丢失的情况:这种情况不会出现paramiko
(只要它已安装),很明显subprocess
,并且只是来自 shell 的(模棱两可的)退出代码和 stderr 消息。还要考虑如何提供要运行的命令:它必须是适合 shell 的命令(由于 SSH 协议的限制),但如果ssh
使用shell 调用,则必须对其进行编码(有时称为“双重转义”)以使本地 shell 的解释成为远程 shell 所需的多字命令。
到目前为止,paramiko
几乎subprocess
是等价的。作为一个更困难的情况,考虑密钥验证失败将如何表现:paramiko
将失败描述为data,而其他人将尝试与用户交互(可能存在也可能不存在)。 paramiko
还支持在一个经过身份验证的连接上打开多个通道;ssh
这样做也是如此,但只能通过ControlMaster
涉及 Unix 套接字文件的复杂配置(在某些部署中可能没有任何好地方存在)。说到配置,如果在设计时没有考虑到这种自动化用例,您可能需要通过-F
以避免用户的复杂性。.ssh/config
总之,库是为像您这样的用例而设计的,因此它们比从面向人类的命令组装您自己的界面(尽管这种手动组合非常有用)更好地工作也就不足为奇了,特别是对于边缘情况可能!)。如果安装一个非标准的依赖喜欢paramiko
是一种负担,至少直接使用subprocess
;去掉第二个壳已经是很大的进步了。
添加回答
举报