您可能会在这里找到类似的问题。但我认为我的情况有所不同。
我有一个在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"并退出。
我在这里说得对吗?
我该如何做这项工作?
简短的回答是,不,可能没有办法让远程 ssh 服务器使用与远程帐户的登录 shell 不同的 shell 启动命令,或者根本不使用 shell。
但让我们从客户端开始。当你跑步时:
ssh root@192.168.x.x /bin/sh "some command"
Run Code Online (Sandbox Code Playgroud)
ssh 进程接收三个命令行参数:
root@192.168.x.x/bin/shsome 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 来运行会话命令。话虽如此,有几种情况。
如果远程客户端受到强制命令(在用户的authorized_keys 文件或服务器的sshd 配置中设置)的约束,则服务器将使用强制命令作为运行命令。
如果远程客户端请求像 sftp 这样的子系统,那么服务器将Subsystem在其配置文件中找到正确的行,并从中获取要执行的命令。[有一个名为“internal-sftp”的子系统受到特殊处理,但与此处无关。]
远程客户端可以指定要运行的命令字符串,如上所述。
远程客户端可以请求会话,而无需指定要运行的特定命令。
为了实际启动会话,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 服务器——通常是商业服务器——假设其中之一可能提供不同的行为。
| 归档时间: |
|
| 查看次数: |
4248 次 |
| 最近记录: |