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

在python脚本中通过ssh执行哪个命令

在python脚本中通过ssh执行哪个命令

守着一只汪 2021-08-11 17:25:40
我正在尝试which solsql在 Python 脚本中通过 SSH运行命令。我认为问题出在ssh命令而不是 Python 部分,但也许两者都有。我试过了subprocess.check_output("ssh root@IP which solsql",    stderr=subprocess.STDOUT, shell=True)但我收到一个错误。我尝试手动运行命令:ssh root@{server_IP}" which solsql"我得到了不同的输出。在服务器上我得到了真实路径 ( /opt/solidDB/soliddb-6.5/bin/solsql) 但通过 SSH 我得到了这个:which: no solsql in(/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin)
查看完整描述

3 回答

?
泛舟湖上清波郎朗

TA贡献1818条经验 获得超3个赞

当您通过 SSH 运行命令时,您的 shell 会执行一组与您交互式连接到服务器时不同的启动文件。因此,根本问题实际上是,PATH当您通过ssh脚本连接时,安装此工具的路径不在您的路径中。


一个常见但粗略的解决方法是强制 shell 读入具有PATH您想要的定义的文件;但当然,这基本上要求您至少知道正确PATH设置的位置,因此您不妨首先弄清楚该工具的确切安装位置。


ssh server '. .bashrc; type -all solsql'

(假设PATH在您的.bashrc; 中设置了; 并且暂时忽略以自己和作为执行内容之间的区别root。前面的点和空格.bashrc非常重要。还要注意我们如何使用 POSIX 命令type而不是which应该使用的 brittle 命令几十年前死于自然但可怕的死亡)。


如果您很清楚该工具的安装位置,也许可以这样做


subprocess.check_output(['ssh', 'root@' + ip, '''

    for path in /opt/solidDB/*/bin /usr/local/bin /usr/bin; do

         test -x "$path/solsql" || continue

         echo "$path"

         exit 0

     done

     exit 1'''])

注意我们如何避免 (here, useless) shell=True。也许还可以参见子进程中“shell=True”的实际含义


查看完整回答
反对 回复 2021-08-11
?
holdtom

TA贡献1805条经验 获得超10个赞

首先,您需要调试错误。


使用这样的代码:


command = "ssh root@IP which solsql"


try:

    retult = subprocess.check_output(command,shell=True,stderr=subprocess.STDOUT)

except subprocess.CalledProcessError as e:

    raise RuntimeError("command '{}' return with error (code {}): {}".format(e.cmd, e.returncode, e.output))


print ("Result:", result)

它会向您输出错误消息,您将知道该怎么做,例如,ssh 可能要求输入密码,或者没有找到您的密钥,或其他。


查看完整回答
反对 回复 2021-08-11
  • 3 回答
  • 0 关注
  • 161 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信