强制 SSH 使用特定的 shell

pli*_*han 33 ssh shell bash command-line-interface

有没有办法强制 SSH 在远程端使用特定的 shell,而不管用户的默认 shell 是什么?

我尝试过类似的解决方案:

ssh host.domain.com /bin/bash -c 'complicated, multi-line command'
Run Code Online (Sandbox Code Playgroud)

但不幸的是,远程端的默认 shell 负责解析“复杂的多行命令”部分,我很难充分地转义它以供 Bash 和 C shell 用户使用。

Ign*_*ams 17

使用 heredoc:

ssh host.domain.com /bin/bash << EOF
big ugly commands
lots of them
EOF
Run Code Online (Sandbox Code Playgroud)

  • @EricWoodruff,......调用一个特定的shell(在这种情况下是bash)*正是*这显示了如何做。 (4认同)

Fáb*_*tos 15

您可以使用该-t选项为要启动的程序强制分配伪 tty,就好像您正在执行标准 shell。然后将您想要的外壳作为一个普通的旧参数传递。

使用这种技术,您不仅可以使用任何已安装的 shell,还可以通过单个命令打开 vim 和其他需要 TTY 的程序。如果您正在编写一个 shell 脚本,将您登录到某个地方并在 vim 或 htop 或其他东西上打开一个文件,这很酷。

这是 bash

me@my-machine $ ssh root@myhost -t bash
root@myhost:~# 
Run Code Online (Sandbox Code Playgroud)

sh也有效。就像其他任何事情一样。

me@my-machine $ ssh root@myhost -t sh
# 
Run Code Online (Sandbox Code Playgroud)

不确定这是否是一个登录 shell,但有一些选项可以让 bash 像登录 shell 一样工作,所以你的 shell 可能也有。

  • 我不明白为什么这在搜索结果中没有出现更高的位置。完美地工作! (4认同)

sys*_*138 11

我不相信这是可能的,至少对于基于 openssh 的系统是这样。如果您有能力,更好的解决方案可能是 sftp 一个 shell 脚本文件,然后使用您发布的方法执行它。它的优点是可以最大限度地减少所需的转义量,但会留下一个必须删除的文件(也许作为脚本的最后一步)。

  • 这就是我最终所做的,但是使用了 scp。一个好主意。 (2认同)

Kur*_*fle 10

使用基于密钥的登录,而不是基于密码的登录。然后,您可以将一个(列表)“强制命令”添加到安装在服务器上的公共 ssh 密钥(在SSH1 的情况下在“选项”字段中)(在~/.ssh/authorized_keys文件中用于 SSH1 , ~/.ssh2/ SSH2授权)。

执行强制命令,以便调用所需的 shell...

更多:您最多可以将一个强制命令关联到一个给定的键。如果出于不同目的需要多个强制命令,则必须设置不同的键。(当然,您可以将多个内容放入一个脚本中,您可以通过强制命令调用该脚本。但请注意,如果用户登录,则始终针对给定帐户/密钥运行强制命令,无论他是否要求运行其他内容。如果您仍想遵守要求的原始命令,请查看如何利用该$SSH_ORIGINAL_COMMAND变量...)

通过 Google阅读有关“强制命令”的信息。