【问题标题】:How to do remote ssh non-interactively如何以非交互方式进行远程 ssh
【发布时间】:2013-06-13 14:34:44
【问题描述】:

我正在尝试通过以下命令从本地主机连接到远程主机。但是远程主机中有一个设置,在我们登录后不久它会提示输入徽章 ID、密码和登录原因,因为它在remote-host 上的profile 文件中是这样编码的 我如何克服这些步骤并以非交互方式直接登录,而不会干扰profile 中的代码。

jsmith@local-host$ ssh -t -t generic_userID@remote-host
Enter your badgeID, < exit > to abort:
Enter your password for <badgeID> :
Enter a one line justification for your interactive login to generic_userID

【问题讨论】:

  • 远程主机上的默认 shell 是什么?

标签: ssh non-interactive


【解决方案1】:

小修改:需要克服远程服务器期望的方法,但是如果本地脚本连接到一堆远程服务器,可能会破坏配置,只需使用 SSH 选项:

ssh -f -q -o BatchMode=yes -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null USER@TARGETSYSTEM

如果没有 ssh_key 设置,这将省略询问密码,静默退出并继续使用脚本/其他主机。

使用 -f 将 ssh 置于后台,这是在从 sh(批处理)文件调用 ssh 命令以删除本地控制台重定向到远程输入(隐含 -n)时所必需的。

【讨论】:

    【解决方案2】:

    考虑在expect 周围设置一个包装脚本。这应该完全符合您的要求。

    Here 是您可以参考的几个示例。

    【讨论】:

      【解决方案3】:

      我已投票支持Marvin Pinto's answer,因为完全有理由编写此脚本,以防您需要配置文件中的其他功能,例如每日消息motd

      但是,如果您不想制作脚本并且不希望配置文件中的其他功能,则有一个快速而肮脏的替代方案。根据您在远程主机上首选的 shell,您可以坚持让 shell 绕过配置文件。例如,如果bash 在远程主机上可用,您可以调用它:

      ssh -t -t generic_userID@remote-host bash --noprofile
      

      我在 macOS 10.13 版本的 OpenSSH 上测试了上述内容。通常 ssh 调用结束时的命令以非交互方式运行,但 -t 标志允许 bash 启动交互式 shell。

      详情为in the Start-up files section of the Bash Reference Manual

      【讨论】:

      • 这可能无法按预期工作。该 ssh 命令将导致 sshd 调用字符串“bash --noprofile”作为 shell 命令。换句话说,sshd 将调用$SHELL -c 'bash --noprofile' 的等价物。由 sshd 启动的 shell 实例仍然会执行它所执行的任何初始化。
      • @Kenster 我用 bash 作为默认 shell 进行了测试,~/.bash_profile 没有运行。
      • -t user@host bash --noprofile 有助于在远程主机上模拟非交互式 shell。我想模拟脚本将在其下执行的环境(特别是 $PATH),因为非交互式 shell 不会像交互式 shell 那样隐式地 source .bash_profile
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-05
      • 1970-01-01
      • 1970-01-01
      • 2011-12-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多