下面的帖子里有一句话。
登录 Shell 和非登录 Shell 之间的区别?
重点在这里:
获得非交互式登录 shell 的另一种方法是使用通过标准输入传递的命令远程登录,该命令不是终端,例如(与运行非交互式、非登录 shell
ssh example.com <my-script-which-is-stored-locally
相反)ssh example.com my-script-which-is-on-the-remote-machine
)。
作者从上述描述中得出两个结论。
非交互式登录 shell
ssh example.com <my-script-which-is-stored-locally
非交互式、非登录 shell
ssh example.com my-script-which-is-on-the-remote-machine
我认为第二个结论并不正确。
执行时ssh example.com my-script-which-is-on-the-remote-machine
,仍要求本地输入帐户名和密码。
它仍然是一个非交互式登录 shell!
登录 shell:登录 shell 以指定用户身份登录系统,为此需要用户名和密码
根据网络登录 shell 上的描述
对于非交互式非登录shell,这里举个例子:一些守护进程如mysqld或apache2,它们都是非交互式非登录shell。
轮到你了:真还是假?
答案1
当执行 ssh example.com my-script-which-is-on-the-remote-machine 时,仍然要求本地输入帐户名和密码。
它仍然是一个非交互式登录 shell!
登录 shell 的交互性不是由“您输入登录名和密码”的情况定义的。本地会提示您输入密码ssh
(或使用密钥),它将它们传递到远程sshd
服务器,只有在正确验证它们的情况下,才会给您一个shell
(除非您UseLogin yes
在 中使用sshd_config
,这是相当危险的)。
答案2
登录用行话来说就是核心概念——login shell。
有四个抽象阶段来描述Linux工作:Init、Getty、Login、Shell。
这里的login是一个程序,它获取用户名作为参数,并提示用户输入密码。
在本地端:
vim /tmp/shell.sh
shopt login_shell
在服务器端(我的 vps 服务器):
vim /tmp/shell.sh
shopt login_shell
1.非交互式登录shell
一般格式: ssh example.com <my-script-which-is-stored-locally
ssh root@vps_ip < /tmp/shell.sh
Pseudo-terminal will not be allocated because stdin is not a terminal.
login_shell on
更清楚
ssh -t -t root@vps_ip < /tmp/shell.sh
Last login: Wed Mar 8 03:16:00 2017 from vps_ip
root@localhost:~$
root@localhost:~$ shopt login_shell
login_shell on
当地翻译中断ssh -t -t root@vps_ip < /tmp/shell.sh
分为两部分。
1.ssh -t -t root@vps_ip
登录程序接受root作为vps上的用户,登录。
2./tmp/shell.sh
本地端的脚本作为参数传递给远程端的解释器并执行。
其过程中是非交互式的登录shell。
2.非交互式非登录shell
一般格式:ssh example.com my-script-which-is-stored-on-remote-machine
debian8@hwy:~$ssh root@vps_ip '/bin/bash /tmp/shell.sh'
login_shell off
debian8@hwy:~$
其过程中是非交互式非登录shell。
一些技巧可以让它显示为登录 shell。
debian8@hwy:~$ssh root@vps_ip '/bin/bash --login /tmp/shell.sh'
login_shell on
debian8@hwy:~$
整个命令后,vps服务器未登录ssh root@vps_ip '/bin/bash --login /tmp/shell.sh'执行。
这登录外壳开启显示无意义,已登录但vps服务器关闭连接,退出。
吉尔斯的结论 非交互式登录 shell 和非交互式非登录 shell是对的。