我正在尝试在Python脚本中通过SSH运行命令which solsql
。
我认为问题出在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)
答案 0 :(得分:3)
我认为您要寻找的是类似paramiko的东西。一个如何使用该库并向远程系统发出命令的示例。
import base64
import paramiko
key = paramiko.RSAKey(data=base64.b64decode(b'AAA...'))
client = paramiko.SSHClient()
client.get_host_keys().add('ssh.example.com', 'ssh-rsa', key)
client.connect('ssh.example.com', username='THE_USER', password='THE_PASSWORD')
stdin, stdout, stderr = client.exec_command('which solsql')
for line in stdout:
print('... ' + line.strip('\n'))
client.close()
答案 1 :(得分:1)
通过SSH运行命令时,与交互式连接到服务器相比,您的外壳程序会执行不同的启动文件集。因此,根本的问题实际上是,当您通过脚本通过PATH
连接时,安装此工具的路径不在ssh
中。
一个常见但粗略的解决方法是强制外壳程序以所需的PATH
定义读取文件;但是当然,基本上,这基本上需要您至少知道正确的PATH
的设置位置,因此您最好还是先弄清楚该工具的确切安装位置。
ssh server '. .bashrc; type -all solsql'
(假设PATH
已在您的.bashrc
中设置;并且暂时忽略了以您自己和root
的身份执行内容之间的区别。{ {1}}非常重要。还请注意我们是如何使用POSIX命令.bashrc
而不是易碎的type
命令的,而该命令早在数十年前就已经自然死亡了,但可怕的是死亡了。)
如果您对该工具的安装位置有个很好的了解,则可以选择
which
请注意,我们还如何避免使用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'''])
(在这里无用)。也许也请参见Actual meaning of 'shell=True' in subprocess
答案 2 :(得分:0)
首先,您需要调试错误。
使用如下代码:
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可能要求输入密码,找不到密钥或其他原因。