10

我面临一个问题,当我 ssh 到另一台机器时,我的 paramiko ssh 会话没有看到与我手动 ssh 到机器时相同的系统 PATH。这是我的python代码:

cmd = "echo $PATH"
try:
    ssh.connect(ip, username=username, password=password)
except Exception as ex:
    raise Exception("Failed to connect to %s with credentials username='%s' password='%s' %s" \
          % (ip, username, password, ex.message) )

ssh_stdin, ssh_stdout, ssh_stderr = ssh.exec_command(cmd)
output = ssh_stdout.read()

输出显示 /usr/bin:/bin 但是当我手动 ssh 到机器时,系统 PATH 上还有其他几个路径。请帮忙。

4

2 回答 2

15

当您使用 exec_command() 时,我认为不会获取任何 bashrc 或配置文件脚本。也许尝试以下方法:

stdin, stdout, stderr = ssh.exec_command("bash -lc 'echo $PATH'")
my_path = stdout.read().rstrip()

如果问题是您正在尝试运行通常在 PATH 中的命令,但在使用 exec_command() 时却没有,则最好通过其绝对路径调用该命令(运行“which [command]”当您正常登录到另一台机器以找出那是什么时)。

于 2013-09-06T19:38:45.370 回答
8

您最好在运行命令之前加载 bash_profile。否则,您可能会收到“找不到命令”异常。

例如,我写命令command = 'mysqldump -uu -pp -h1.1.1.1 -P999 table > table.sql'的目的是为了转储一个 Mysql 表

然后我必须在该转储命令之前手动加载 bash_profile,方法是键入. ~/.profile; .~/.bash_profile;.

例子

my_command  = 'mysqldump -uu -pp -h1.1.1.1 -P999 table > table.sql;'

pre_command = """
. ~/.profile;
. ~/.bash_profile;
"""

command = pre_command + my_command

stdin, stdout, stderr = ssh.exec_command(command)
于 2014-12-31T11:19:12.873 回答