在一个方法(python)中找不到命令但在另一个方法(shell脚本)中找不到

时间:2015-03-06 17:08:51

标签: python ssh paramiko netezza

我被扔进了另一台机器。在那台机器中,我有一个名为get_count.sh

的脚本
#!/bin/sh

nzsql -u user -pw password -host hostname -port 1234 -db database -c "query"
当我陷入困境时运行此脚本并按预期工作。 ./get_count.sh

我使用的是python模块paramiko。这允许我在机器中ssh并使用python将命令传递给ssh会话。

我收到了输出:

./get_count.sh: line 3: nzsql: command not found

我连接到同一个ssh会话,但我不确定为什么会发生这种情况。基本上这两个过程都在做同样的事情,但我不确定为什么做同样的事情是以一种方式工作而不是以其他方式工作

我尝试将脚本的内容更改为简单的内容,因为我认为这可能是由paramiko引起的。所以我用nzsql查询替换了 echo 123它运作正常。

我的.bashrc

# .bashrc

# Source global definitions
if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi

# User specific aliases and functions

我的.bash_profile

# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi

# User specific environment and startup programs

PATH=$PATH:$HOME/bin

export PATH

我通过paramiko做了echo $PATH我得到了:

 /usr/local/java/current/bin:/usr/lib64/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin

通过登录终端:

/usr/local/java/current/bin:/usr/lib/oracle/11.2/client64/bin:/app/netezza/bin:/usr/lib64/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/bli1/bin

1 个答案:

答案 0 :(得分:3)

我在这里假设您正在调用paramiko方法exec_command()来运行您的命令。

exec_command()与在互动会话中运行相同的命令不同!

相反,当您运行client.exec_command('./get_count.sh')时,您获得的行为相当于ssh yourhost "./get_count.sh"。这只运行一个非交互式 shell,并且不会运行交互式登录shell(由ssh yourhost调用)调用的相同脚本。

首选:模拟Paramiko的exec_command行为在你的壳牌

这里最好的选择是首先从命令行重现;在那里开发修复;然后将端口修复到您的代码。

# do this to reproduce behavior from the command line:
ssh yourhost ./get_count.sh

...然后,通过手动dotfile包含工作。以下是一个粗略的例子,可能是这样的一件事:

ssh yourhost '. .profile; . .bashrc; ./get_count.sh'

使用SSH命令行传递的shell命令后,然后可以将其传递给exec_command() paramiko方法。

后备:从Paramiko获取交互式会话行为

或者,如果您希望paramiko的行为与交互式会话的行为相同,请使用invoke_shell() Paramiko方法。请注意,您必须以这种方式执行大量额外工作 - 模拟按键以执行远程命令,监视输出以确定该命令是否已退出,以及自行确定退出状态。出于这个原因,我不推荐它。

相关问题