您可能会发现类似的问题here。但我认为我的情况不同。
我有一个在ash
shell上的远程机器上运行的程序,它不允许我访问shell
本身,即,每当我打开ssh
会话时它都会运行一个实例无法执行cd
mkdir
等常规命令。它可以列在/etc/profile
中,因此在我打开会话时始终执行。
我知道还有其他shells
个sh
。
所以我想在这里登录sh
而不是ash
,以便我可以禁止process
阻止我。
如果我执行
ssh root@192.168.x.x /bin/sh "some command"
我认为它实际上会进入默认的shell ash
并在其上执行bin/sh "some command"
并退出。
我在这里纠正吗?
我该怎么做?
答案 0 :(得分:4)
简短的回答是,不,有可能无法使远程ssh服务器使用与远程帐户的登录shell不同的shell启动命令,或者根本不使用shell。
但是让我们从客户开始。当你跑:
ssh root@192.168.x.x /bin/sh "some command"
ssh进程接收三个命令行参数:
root@192.168.x.x
/bin/sh
some command
值得注意的是,双引号将从第三个参数中删除。 ssh协议指定要作为单个字符串执行的命令,不单个命令行参数的列表。因此,ssh客户端将第二个和第三个参数连接成一个字符串/bin/sh some command
,并将其发送到远程服务器以供执行。 “某些命令”应该是一个参数的事实将会丢失。如果要在远程命令中保留引号,可以运行以下内容:
ssh root@192.168.x.x '/bin/sh "some command"'
转向服务器,使用最广泛的SSH服务器是OpenSSH,这就是我要谈的内容。 OpenSSH服务器,一个名为sshd
的程序,总是使用远程用户的登录shell来运行会话命令。话虽如此,有几种情况。
如果远程客户端受强制命令的约束 - 在用户的authorized_keys文件或服务器的sshd配置中设置 - 则服务器将使用强制命令作为运行命令。
< / LI>如果远程客户端请求像sftp这样的子系统,那么服务器将在其配置文件中找到正确的Subsystem
行,并从中获取要执行的命令。 [有一个名为“internal-sftp”的子系统得到特殊处理,但这里不相关。]
远程客户端可以指定要运行的命令字符串,如上所述。
远程客户端可以在不指定要运行的特定命令的情况下请求会话。
要实际启动会话,OpenSSH服务器会查找用户的登录shell。如果没有运行命令,服务器只运行没有参数的shell。对于其他三种情况,它运行相当于:
$SHELL -c 'the command'
其中$ SHELL是用户的shell,the command
是命令字符串。
因此,最后:无论您如何指定要运行的命令,服务器都将通过等效的$SHELL -c 'command'
运行它。为此,用户的登录shell必须接受-c
参数和命令才能在其命令行上运行。所有常见shell - Bourne shell,bash,csh,zsh等 - 将接受此语法并使用自己的命令语法解析指定的命令。
如果您对服务器的访问受强制命令的限制,那么您就不走运了。服务器将运行强制命令而不是您请求的命令。
如果服务器上的帐户设置为使用不像传统shell那样的shell,那么你就不走运了。服务器将启动您的登录shell,该程序将执行任何操作。
唯一真正的警告是,假设您连接的服务器可能不使用OpenSSH。那里有other SSH servers - 通常是商业的 - 并且假设其中一个可能提供不同的行为。
答案 1 :(得分:0)
ssh user @ host'/ bin / bash'&lt; shell.txt