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”的实际含义
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 可能要求输入密码,或者没有找到您的密钥,或其他。
添加回答
举报