有没有什么方法可以强制 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
显示完整引用的命令如预期工作。