`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 bash
的 Invocation 部分。完成此操作并确定哪些特定的点文件正在设置您的 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 值