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

时间:2018-11-08 10:48:26

标签: python ssh which

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

3 个答案:

答案 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可能要求输入密码,找不到密钥或其他原因。