为了账号安全,请及时绑定邮箱和手机立即绑定

文件相关操作python子进程vs.原生python

文件相关操作python子进程vs.原生python

慕田峪9158850 2022-06-28 10:12:29
我想通过 ssh 执行一个简单的任务:返回给定文件列表中不存在的所有文件。我这样做的方法是将以下内容包装在 ssh 会话中:for f in $(files); do stat $f > /dev/null ;donestdout 重定向将忽略所有好的文件,然后读取 stderr 将为我提供所有未找到文件的列表。我首先想到将这个 bash 代码与 a 中的 ssh 部分一起使用,subprocess.run(..., shell=True)但不鼓励这样做。相反,paramiko有人建议。我试图理解为什么以及何时原生 python 比子处理 bash 更好不同操作系统的可计算性(对我来说不是问题,因为代码与 Ubuntu 紧密相关)错误和异常处理 - 我确实得到并认为它很重要,尽管从子进程中捕获异常或退出代码也很容易在我看来,原生 python 的缺点是当 bash 的 ssh 和 stat 在我看来更加简单易用时,需要涉及一些复杂的模块,例如 paramiko是否有关于何时以及如何选择 bash 而不是 python 的指南?这个问题主要是关于在 ssh 上使用命令,但与 bash 以简单快捷的方式执行的任何其他命令以及 python 换行有关
查看完整描述

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;去掉第二个壳已经是很大的进步了。


查看完整回答
反对 回复 2022-06-28
  • 1 回答
  • 0 关注
  • 110 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号