在
SSHClient.exec_command默认情况下,不会在“登录”模式下运行壳和用于会话不分配一个伪终端。结果
.bash_profile,与常规的交互式SSH会话相比,(可能)获得了(可能)获得了不同的启动脚本集(尤其是对于非交互式会话,而不是源)。基于
TERM环境变量的存在/不存在,在脚本中采用和/或采用不同的分支。
可能的解决方案(按优先顺序):
- 修复命令,使其不依赖于特定环境。
sesu
在命令中使用完整路径。例如:/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共享对象和查找方面存在类似的问题。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)