我被扔进了另一台机器。在那台机器中,我有一个名为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
答案 0 :(得分:3)
我在这里假设您正在调用paramiko方法exec_command()
来运行您的命令。
exec_command()
与在互动会话中运行相同的命令不同!
相反,当您运行client.exec_command('./get_count.sh')
时,您获得的行为相当于ssh yourhost "./get_count.sh"
。这只运行一个非交互式 shell,并且不会运行交互式登录shell(由ssh yourhost
调用)调用的相同脚本。
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的行为与交互式会话的行为相同,请使用invoke_shell()
Paramiko方法。请注意,您必须以这种方式执行大量额外工作 - 模拟按键以执行远程命令,监视输出以确定该命令是否已退出,以及自行确定退出状态。出于这个原因,我不推荐它。