我需要计算远程计算机中目录中的文件数。我需要ssh到该机器并执行目录计数操作(-lR | grep ^ d | wc -l)。这需要在shell脚本中完成。
我还需要通过传递一个在shell脚本中使用的变量并将结果返回给python程序,从python程序中调用这个shell脚本。
涉及的组件:
Python程序调用shell脚本(传递变量)
对远程计算机执行ssh并执行目录计数
将结果返回到我原来的python程序
答案 0 :(得分:2)
您可以使用subprocess.run功能执行SSH命令。 subprocess.run("ssh user@host -i /path/to/priv_key 'grep ^d'")
,但在传递密码方面变得棘手。所以你有几个选择。
选项A:
使用SSH密钥。 ssh some_identifier 'grep^d'
。或者更好,add the SSH key to your SSH config file所以你可以简单地subprocess.run("putty -ssh user@host -pw your_password 'grep ^d'")
。缺点是此方法仅适用于您的计算机。
选项B:
在Windows上,安装Putty,并使用-pw开关传入密码。 subprocess.run("sshpass --password 'your_password' ssh -oStrictHostKeyChecking=no user@host 'grep -d'")
在Linux / Mac上,使用sshpass。 Background Modes
缺点是Windows用户必须安装Putty,并且在传递密码而不是SSH密钥时安全性较低。
选项C: 使用Python库Paramiko。有关如何执行此操作的信息,请参阅他们的文档,但是,我发现他们的库不是最直观的。特别是在stdin,stdout和stderr上传递和查看数据时。您还引入了第三方依赖项。 Paramiko可以输入密码或SSH密钥。
选项D: 让脚本处理如何创建SSH密钥并将其复制到服务器(如果尚未完成)。系统将提示用户输入一次SSH密码,之后您可以使用选项A进行所有进一步的通信。我以前从未这样做过,但它可以奏效。不利的一面是将这个解决方案放在一起所需的时间。