在SSHClient.exec_command
默认情况下,不会在“登录”模式下运行壳和用于会话不分配一个伪终端。结果.bash_profile
,与常规的交互式SSH会话相比,(可能)获得了(可能)获得了不同的启动脚本集(尤其是对于非交互式会话,而不是源)。基于TERM
环境变量的存在/不存在,在脚本中采用和/或采用不同的分支。
可能的解决方案(按优先顺序):
/bin/sesu test
如果您不知道完整路径,则在常见的* nix系统上,可以which sesu
在交互式SSH会话中使用command。
修复您的启动脚本,以便PATH
为交互式和非交互式会话设置相同的脚本。
尝试通过登录外壳显式运行脚本(使用--login
带有通用* nix外壳的开关):
bash --login -c "sesu test"
如果命令本身依赖于特定的环境设置,并且您无法修复启动脚本,则可以在命令本身中更改环境。语法取决于远程系统和/或外壳。在常见的* nix系统中,这可以工作:
PATH="$PATH;/path/to/sesu" && sesu test
另一种(不推荐)的方法是使用get_pty
参数强制为“ exec”通道分配伪终端:
stdin,stdout,stderr=ssh.exec_command('sesu test', get_pty=True)
使用伪终端自动执行命令会给您带来讨厌的副作用。例如,请参见例如,有没有一种简单的方法来摆脱使用Python的Paramiko库进行SSH并从远程计算机的CLI提取输出时出现的垃圾值?
您可能在LD_LIBRARY_PATH
共享对象和查找方面存在类似的问题。