如何强制登录远程计算机上的非默认 shell?

Ram*_*ddy 1 ssh bash shell sh

您可能会在这里找到类似的问题。但我认为我的情况有所不同。

我有一个在ashshell 上的远程计算机上运行的程序,它不允许我访问它shell本身,即,每当我打开会话时它都会运行一个实例ssh,并且我无法执行诸如等的正常命令。cd mkdir它可以在 中列出/etc/profile,因此它正在执行总是当我打开会话时。

我知道还有其他一些shells类似的sh

所以我想在这里登录sh而不是ash这样我可以抑制process阻止我的情况。

如果我执行

  ssh root@192.168.x.x /bin/sh "some command"
Run Code Online (Sandbox Code Playgroud)

我认为它实际上进入了默认 shell ash,并在其上执行bin/sh "some command"并退出。

我在这里说得对吗?

我该如何做这项工作?

Ken*_*ter 5

简短的回答是,不,可能没有办法让远程 ssh 服务器使用与远程帐户的登录 shell 不同的 shell 启动命令,或者根本不使用 shell。

但让我们从客户端开始。当你跑步时:

ssh root@192.168.x.x /bin/sh "some command"
Run Code Online (Sandbox Code Playgroud)

ssh 进程接收三个命令行参数:

  1. root@192.168.x.x
  2. /bin/sh
  3. some command

值得注意的是,双引号将从第三个参数中删除。ssh 协议将要执行的命令指定为单个字符串,而不是单个命令行参数的列表。因此 ssh 客户端会将第二个和第三个参数连接成一个字符串 ,/bin/sh some command并将其发送到远程服务器执行。“某些命令”应该是单个参数的事实将会丢失。如果您想在远程命令中保留引号,您可以运行如下命令:

ssh root@192.168.x.x '/bin/sh "some command"'
Run Code Online (Sandbox Code Playgroud)

转向服务器,使用最广泛的 SSH 服务器是OpenSSH,所以这就是我要讲的。OpenSSH 服务器是一个名为 的程序sshd,它始终使用远程用户的登录 shell 来运行会话命令。话虽如此,有几种情况。

  1. 如果远程客户端受到强制命令(在用户的authorized_keys 文件或服务器的sshd 配置中设置)的约束,则服务器将使用强制命令作为运行命令。

  2. 如果远程客户端请求像 sftp 这样的子系统,那么服务器将Subsystem在其配置文件中找到正确的行,并从中获取要执行的命令。[有一个名为“internal-sftp”的子系统受到特殊处理,但与此处无关。]

  3. 远程客户端可以指定要运行的命令字符串,如上所述。

  4. 远程客户端可以请求会话,而无需指定要运行的特定命令。

为了实际启动会话,OpenSSH 服务器会查找用户的登录 shell。如果没有要运行的命令,服务器将简单地运行不带参数的 shell。对于其他三种情况,它运行相当于:

$SHELL -c 'the command'
Run Code Online (Sandbox Code Playgroud)

其中 $SHELL 是用户的 shell,the command是命令字符串。

所以,最后:无论您如何指定要运行的命令,服务器都会通过相当于$SHELL -c 'command'. 为了执行您想要的操作,用户的登录 shell 必须接受一个-c参数和一个在其命令行上运行的命令。所有常见的 shell(Bourne shell、bash、csh、zsh 等)都将接受此语法并使用自己的命令语法解析指定的命令。

如果您对服务器的访问受到强制命令的控制,那么您就不走运了。服务器将运行强制命令而不是您请求的命令。

如果您在服务器上的帐户设置为使用与传统 shell 不同的 shell,那么您就不走运了。服务器将启动您的登录 shell,该程序将执行它所做的任何操作。

这里唯一真正需要注意的是,假设您要连接的服务器可能不使用 OpenSSH。还有其他 SSH 服务器——通常是商业服务器——假设其中之一可能提供不同的行为。