ssh如何运行命令?


15

我在客户端和服务器上都使用Bash。通过SSH运行命令时:

  • ssh <host> 'declare' 给出了一个shell变量列表。

  • ssh <host> 'mount' 给出安装点列表。

但是,declare是Bash内置的,mount而是外部命令。如果服务器上有内置的Shell和具有相同名称的外部命令,SSH如何知道要运行哪个?


2
ssh始终运行存储在中的shell /etc/passwd。如果这是/usr/sbin/nologin你无法登录。
IPOR Sircer

Answers:


21

ssh运行您在远程用户的外壳提供的命令(从所获得的/etc/passwd),作为可见从源代码

argv[0] = (char *) shell0;
argv[1] = "-c";
argv[2] = (char *) command;
argv[3] = NULL;
execve(shell, argv, env);

因此,为您的示例在远程服务器上执行的相应命令是:

  • bash -c declare
  • bash -c mount

它们都传递给bash和进行评估。内置函数在内部进行求值,并且外部命令的调用就像在本地命令行提示符下那样进行。


如果外壳程序始终由ssh守护程序启动,那么有趣的是,当用户使用命令调用ssh时,即使用户执行某种登录,该外壳程序也不是登录外壳程序。任何想法?
赛尔(Cyker)'16

是。运行命令的外壳是1)没有登录外壳2)没有交互外壳。您可以通过-t开关强制进行交互,但仍不会加载rc文件。
雅库耶

1
请注意,sshd(服务器)正在执行此操作,而不是ssh(客户端)正在执行此操作。
ysdx

@ysdx他们正在一起工作。客户端告诉服务器通过外壳执行命令,然后服务器执行该命令。
Barmar
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.