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

我正在尝试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)


守着一只汪
浏览 166回答 3
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”的实际含义

holdtom

首先,您需要调试错误。使用这样的代码: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 可能要求输入密码,或者没有找到您的密钥,或其他。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python