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

我正在使用paramikoSSHClient 通过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 环境所需的内容后,您应该可以更好地决定要实施哪种解决方案。

标签: python shell ssh subprocess paramiko


【解决方案1】:

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

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

丰富点:

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

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

【讨论】:

    猜你喜欢
    • 2021-04-03
    • 2016-11-19
    • 2015-09-21
    • 2015-07-10
    • 2021-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多