强制 SSH 使用特定 shell

强制 SSH 使用特定 shell

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

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

ssh host.domain.com /bin/bash -c 'complicated, multi-line command'

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

答案1

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

答案2

您可以使用该-t选项强制为要启动的程序分配伪终端,就像执行标准 shell 一样。然后将所需的 shell 作为普通参数传递。

使用此技术,您不仅可以使用已安装的任何 shell,还可以通过单个命令打开 vim 和其他需要 TTY 的程序。如果您正在编写一个 shell 脚本,该脚本会将您登录到某个位置并在 vim、htop 或类似程序上打开文件,那么这很酷。

以下是bash

me@my-machine $ ssh root@myhost -t bash
root@myhost:~# 

sh也有效。其他东西也一样。

me@my-machine $ ssh root@myhost -t sh
# 

不确定这是否是一个登录 shell,但有一些选项可以让 bash 充当登录 shell,所以你的 shell 可能也有这个功能。

答案3

使用定界文档:

ssh host.domain.com /bin/bash << EOF
big ugly commands
lots of them
EOF

答案4

令人惊讶的是,我看到了以下不同的结果:

在 dash 中运行:

ssh [email protected] /bin/bash -c "echo <(cat)"                                              
sh: 1: Syntax error: "(" unexpected

与bash相比:

ssh [email protected] '/bin/bash -c "echo <(cat)"'                                            
/dev/fd/63

显示完整引用的命令如预期工作。

相关内容