ssh 命令和非交互式、非登录 shell

ssh 命令和非交互式、非登录 shell

下面的帖子里有一句话。
登录 Shell 和非登录 Shell 之间的区别?

重点在这里:
获得非交互式登录 shell 的另一种方法是使用通过标准输入传递的命令远程登录,该命令不是终端,例如(与运行非交互式、非登录 shell
ssh example.com <my-script-which-is-stored-locally相反)ssh example.com my-script-which-is-on-the-remote-machine)。

作者从上述描述中得出两个结论。

  1. 非交互式登录 shell

     ssh example.com <my-script-which-is-stored-locally           
    
  2. 非交互式、非登录 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是对的。

相关内容