`paramiko` 中的 `shell=True` 的等价物是啥? [复制]

Posted

技术标签:

【中文标题】`paramiko` 中的 `shell=True` 的等价物是啥? [复制]【英文标题】:what is the equivalent of `shell=True` in `paramiko`? [duplicate]`paramiko` 中的 `shell=True` 的等价物是什么? [复制] 【发布时间】:2022-01-21 17:11:35 【问题描述】:

我正在使用paramiko 的SSHClient 通过exec_command 方法控制服务器。但是,我没有在那里使用 python,因为它说 python not found 并且我意识到整个 conda 环境不存在。在我的本地机器上,我通过将shell=True 传递给subprocess 来解决它。问题:我如何在 paramiko 上执行此操作,或者,我应该运行另一个命令以将 conda 加载到服务器的 shell 中。

编辑:exec_command 提供 environment 可选关键字,但如果它有用的话,我不知道如何利用它。

【问题讨论】:

sshd always 运行一个 shell。 paramiko 没有等价于shell=False,因为没有办法告诉远程服务器不要启动它。 您所依赖的更可能是远程 shell 被视为 login shell,这会影响它选择执行的点文件。 (当您传递命令时,默认情况下您不会获得登录 shell;这不是 paramiko 特有的;常规命令行 ssh 客户端的工作方式相同)。 ...比较ssh somehost,然后运行python,一旦它进入(获得登录shell)到ssh somehost python(从非交互式shell启动Python)。在这两种情况下仍然有一个 shell,但它运行的 dotfiles 是不同的。 有关在 shell 启动期间在什么条件下读取点文件的一般背景知识,请参阅man bashInvocation 部分。完成此操作并确定哪些特定的点文件正在设置您的 Python 环境所需的内容后,您应该可以更好地决定要实施哪种解决方案。 【参考方案1】:

感谢@CharesDuffy 富有洞察力的 cmets 以“不要喂我教我如何钓鱼”的风格,我解决了如下问题:

为了加载 conda/miniconda,我在命令前加上 source ~/miniconda3/bin/activate;

丰富点:

对于永久解决方案,可以将前言添加到.profile.bash_profile.bash_login,这是ssh 时默认加载的内容。如果您有全新安装,例如虚拟机,这些文件一开始就不存在。 采购该 conda 文件至关重要(而不是执行它)

表面上,subprocess 模块的 shell=True kwarg 正在幕后做类似的事情。

【讨论】:

以上是关于`paramiko` 中的 `shell=True` 的等价物是啥? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

paramiko exec_command 返回 shell 脚本 exit 值

paramiko中exec_command和invoke_shell方法都出现EOF错误

如何从 paramiko 的标准输出中删除坏字符 [重复]

Python ssh 远程执行shell命令

paramiko的简单使用(ssh远程执行脚本和上传文件)

paramiko