ssh
如何通过远程服务器强制使用特定 shell 进行非交互式命令执行?
我在远程服务器上的默认 shell 是zsh
,但我需要使用 执行给定的命令/bin/sh
。当我运行以下命令时,foo
将由zsh
(按预期)执行:
ssh -tq -l root -o LogLevel=ERROR remote-server "foo"
我尝试过指定/bin/sh -c "foo"
,但这只会导致zsh
启动/bin/sh
然后执行foo
。
我需要/bin/sh
直接使用,而不是通过zsh
是否有一些选项ssh
,或者一些本地或远程设置,以便我可以定义不同的 shell?
我可以为所有非交互式命令(非登录 shell)设置不同的 shell 吗?
答案1
从设计上来说,绕过登录 shell 是不可能的。您可以设置一个 SSH 帐户,其 shell 受到限制(例如,rsh/rksh/rbash/… 中的受限制 shell,或仅允许某些特定协议(如 rssh 或 git-shell)的 shell)。客户端不能指定不同的 shell。
要在不同的 shell 中运行代码,您必须使登录 shell 运行该 shell 并将代码传递到内 shell。这与用其他语言(例如 perl、python 等)运行解释代码所需执行的操作没有什么不同。请注意正确引用。如果不需要标准输入,请在标准输入上传递脚本,这样就不需要嵌套引用。
同一帐户的用户数据库中可以有多个条目。 “同一账户”是指同一用户ID。这些条目必须具有不同的用户名,并且可以具有不同的密码、不同的 shell 等。请参阅您可以为一个用户帐户指定多个密码吗?。请注意,这不是很可靠,因为某些程序从用户 ID 进行查找(而不是从环境变量中的用户名进行查找,$USER
环境变量设置为用户登录时选择的名称)。
如果你想要 zsh 进行交互使用,但想要使用 Bourne 风格的 SSH shell,你可以按照我的做法:我将登录 shell 设置为/bin/sh
(或者任何需要 POSIX shell 的东西),并且我有(一些更复杂的版本) )export SHELL=/bin/zsh; exec $SHELL
在我的.profile
。