在一个方法(python)中找不到命令,但在另一个方法(shell脚本)中找不到命令
我被送进了另一台机器。在这台机器中,我有一个名为在一个方法(python)中找不到命令,但在另一个方法(shell脚本)中找不到命令,python,ssh,paramiko,netezza,Python,Ssh,Paramiko,Netezza,我被送进了另一台机器。在这台机器中,我有一个名为get\u count.sh #!/bin/sh nzsql -u user -pw password -host hostname -port 1234 -db database -c "query" 当我加入时运行此脚本,它将按预期工作/get\u count.sh #!/bin/sh nzsql -u user -pw password -host hostname -port 1234 -db database -c "query"
get\u count.sh
#!/bin/sh
nzsql -u user -pw password -host hostname -port 1234 -db database -c "query"
当我加入时运行此脚本,它将按预期工作/get\u count.sh
#!/bin/sh
nzsql -u user -pw password -host hostname -port 1234 -db database -c "query"
我正在使用python模块paramiko
。这允许我在机器中使用ssh,并使用python将命令传递给ssh会话
我得到了输出:
/get\u count.sh:未找到第3行:nzsql:命令
我连接到同一个ssh会话,但我不确定为什么会发生这种情况。从本质上讲,这两个过程做的是同一件事,但我不确定为什么做同样的事情是以一种方式工作,而不是以另一种方式工作
我尝试将脚本的内容更改为简单的内容,因为我认为这可能是由于paramiko
。因此,我将我的nzsql
查询替换为
echo 123
功能正常
我的.bashrc
:
# .bashrc
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
# User specific aliases and functions
我的.bash\u配置文件
:
# .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
这里,我假设您正在调用paramiko方法
exec_command()
来运行您的命令
exec_command()
与在交互式会话中运行相同的命令不同强>
相反,当您运行client.exec\u命令('./get\u count.sh')
时,您得到的行为相当于ssh您的主机“/get\u count.sh”
。它只运行一个非交互式shell,并且不运行交互式登录shell(由ssh yourhost
调用)调用的脚本
首选:在Shell中模拟Paramiko的
exec_命令
行为
您在这里的最佳选择是首先从命令行复制;在那里制定一个解决方案;然后将修复程序移植到代码中
# do this to reproduce behavior from the command line:
ssh yourhost ./get_count.sh
…然后,执行手动点文件包含。下面是一个大致的例子,它可能是这样的:
ssh yourhost '. .profile; . .bashrc; ./get_count.sh'
在SSH命令行上传递了与shell命令相关的内容后,可以将其传递给exec\u command()
paramiko方法
回退:从Paramiko获取交互式会话行为
或者,如果希望paramiko的行为与交互式会话相同,请使用
invoke_shell()
paramiko方法。注意,您必须以这种方式做大量额外的工作——模拟击键以执行远程命令,监视输出以确定该命令是否已退出,以及自己确定退出状态。出于这个原因,我不推荐它。我在这里假设您正在调用paramiko方法exec_command()
来运行您的命令
exec_command()
与在交互式会话中运行相同的命令不同强>
相反,当您运行client.exec\u命令('./get\u count.sh')
时,您得到的行为相当于ssh您的主机“/get\u count.sh”
。它只运行一个非交互式shell,并且不运行交互式登录shell(由ssh yourhost
调用)调用的脚本
首选:在Shell中模拟Paramiko的
exec_命令
行为
您在这里的最佳选择是首先从命令行复制;在那里制定一个解决方案;然后将修复程序移植到代码中
# do this to reproduce behavior from the command line:
ssh yourhost ./get_count.sh
…然后,执行手动点文件包含。下面是一个大致的例子,它可能是这样的:
ssh yourhost '. .profile; . .bashrc; ./get_count.sh'
在SSH命令行上传递了与shell命令相关的内容后,可以将其传递给exec\u command()
paramiko方法
回退:从Paramiko获取交互式会话行为
或者,如果希望paramiko的行为与交互式会话相同,请使用
invoke_shell()
paramiko方法。注意,您必须以这种方式做大量额外的工作——模拟击键以执行远程命令,监视输出以确定该命令是否已退出,以及自己确定退出状态。出于这个原因,我不推荐它。我在这里假设您正在调用paramiko方法exec_command()
来运行您的命令
exec_command()
与在交互式会话中运行相同的命令不同强>
相反,当您运行client.exec\u命令('./get\u count.sh')
时,您得到的行为相当于ssh您的主机“/get\u count.sh”
。它只运行一个非交互式shell,并且不运行交互式登录shell(由ssh yourhost
调用)调用的脚本
首选:在Shell中模拟Paramiko的
exec_命令
行为
您在这里的最佳选择是首先从命令行复制;在那里制定一个解决方案;然后将修复程序移植到代码中
# do this to reproduce behavior from the command line:
ssh yourhost ./get_count.sh
…然后,执行手动点文件包含。下面是一个大致的例子,它可能是这样的:
ssh yourhost '. .profile; . .bashrc; ./get_count.sh'
在SSH命令行上传递了与shell命令相关的内容后,可以将其传递给exec\u command()
paramiko方法
回退:从Paramiko获取交互式会话行为
或者,如果希望paramiko的行为与交互式会话相同,请使用
invoke_shell()
paramiko方法。注意,您必须以这种方式做大量额外的工作——模拟击键以执行远程命令,监视输出以确定该命令是否已退出,以及自己确定退出状态。出于这个原因,我不推荐它。我在这里假设您正在调用paramiko方法exec_command()
来运行您的命令
exec_command()
不同于从in中运行相同的命令