如何ssh到远程计算机并在shell脚本中执行文件计数并返回结果

时间:2017-08-31 22:23:52

标签: python bash shell ssh subprocess

我需要计算远程计算机中目录中的文件数。我需要ssh到该机器并执行目录计数操作(-lR | grep ^ d | wc -l)。这需要在shell脚本中完成。

我还需要通过传递一个在shell脚本中使用的变量并将结果返回给python程序,从python程序中调用这个shell脚本。

涉及的组件:

  1. Python程序调用shell脚本(传递变量)

  2. 对远程计算机执行ssh并执行目录计数

  3. 将结果返回到我原来的python程序

1 个答案:

答案 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上,使用sshpassBackground Modes  缺点是Windows用户必须安装Putty,并且在传递密码而不是SSH密钥时安全性较低。

选项C:   使用Python库Paramiko。有关如何执行此操作的信息,请参阅他们的文档,但是,我发现他们的库不是最直观的。特别是在stdin,stdout和stderr上传递和查看数据时。您还引入了第三方依赖项。 Paramiko可以输入密码或SSH密钥。

选项D: 让脚本处理如何创建SSH密钥并将其复制到服务器(如果尚未完成)。系统将提示用户输入一次SSH密码,之后您可以使用选项A进行所有进一步的通信。我以前从未这样做过,但它可以奏效。不利的一面是将这个解决方案放在一起所需的时间。