概要
SSH
是传输层和应用层上的安全协议,它只能通过加密连接双方会话的方式来保证连接的安全性。
当使用 ssh
客户端工具连接成功后,将建立客户端和服务端之间的会话,该会话是被加密的,之后客户端和服务端的通信都将通过会话传输。
SSH 服务的守护进程为
sshd
,默认监听在22
端口上。
所有 ssh
客户端工具,包括 ssh
命令,scp
,sftp
,ssh-copy-id
等命令都是借助于 ssh
连接来完成任务的。
也就是说它们都连接服务端的 22
端口,只不过连接上之后将待执行的相关命令转换传送到远程主机上,由远程主机执行。
登录到目标机器
ssh [-p port] destination
-p port
选项指定远程 sshd
监听的端口。
destination
的格式有以下两种:
[user@]hostname
-
ssh://[user@]hostname[:port]
(URI 形式(form
)的)
不指定 [user@]
的话,默认使用本机的当前用户进行登录操作。
-t 和 -T 选项
通过 man ssh
我们可以得知以下信息:
-
-T
:禁止分配伪终端。(Disable pseudo-terminal allocation
) -
-t
:强制分配伪终端。(Force pseudo-terminal allocation
)
小朋友你是否有很多问号?
- (1)什么是伪终端(
pseudo-terminal
)? - (2)伪终端在
ssh
客户端还是服务端创建? - (2)
ssh
是否分配伪终端的区别是什么?
解答:
- (1) 伪终端的介绍请参考: Linux 的伪终端的基本原理 及其在远程登录(SSH,telnet等)中的应用
- (2)伪终端在
ssh
服务端创建 - (3)不分配伪终端,会导致一些需要
tty
的命令无法正常使用。比如vim
ssh
命令存在两种基本模式,一是登录到远程机器,二是在远程机器上执行代码。
登录模式
meikai@ubuntu:~$ ssh localhost
Welcome to Ubuntu 20.04.2 LTS (GNU/Linux 5.8.0-50-generic x86_64)
Last login: Tue Apr 27 23:51:26 2021 from 127.0.0.1
meikai@ubuntu:~$ tty
/dev/pts/5
从上面可以看出,【登录模式】默认会分配伪终端 tty
。
meikai@ubuntu:~$ ssh -T localhost
Welcome to Ubuntu 20.04.2 LTS (GNU/Linux 5.8.0-50-generic x86_64)
tty
not a tty
指定 -T
选项后,会禁止 tty
的分配。
执行不需要 tty
的命令显示正常:
uname -a
Linux ubuntu 5.8.0-50-generic #56~20.04.1-Ubuntu SMP Mon Apr 12 21:46:35 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
此时执行 vim
命令(需要一个 tty
伪终端)会出现如下所示的错误:
vim aa
Vim: Warning: Output is not to a terminal
Vim: Warning: Input is not from a terminal
命令模式
meikai@ubuntu:~$ ssh localhost "tty"
not a tty
从上面可以看出,【命令模式】默认不会分配伪终端 tty
。
我们通过【命令模式】执行 vim
命令会出现上文同样的错误。
meikai@ubuntu:~$ ssh localhost "vim aa"
Vim: Warning: Output is not to a terminal
Vim: Warning: Input is not from a terminal
指定 -t
选项后,会对当前的 ssh session
分配一个 tty
。
meikai@ubuntu:~$ ssh localhost -t "tty"
/dev/pts/7
Connection to localhost closed.
此时可以正常执行 vim
命令。
meikai@ubuntu:~$ ssh localhost -t "vim aa"
Connection to localhost closed.
保存一些文本后,我们可以通过 cat aa
命令进行查询,确认进行了正常的保存操作。
meikai@ubuntu:~$ cat aa
aa
aaa
bbb
至此,我们可以得出以下结论:
- 【登录模式】
- 默认分配伪终端,同指定
-t
选项效果相同。 - 可以通过
-T
选项禁止分配伪终端。
- 默认分配伪终端,同指定
- 【命令模式】
- 默认不分配伪终端,同指定
-T
选项效果相同。 - 可以通过
-t
选项强制分配伪终端。
- 默认不分配伪终端,同指定
通过 man ssh
,我们还可以得知:如果未分配伪终端,则该会话是透明的,可用于可靠地传输二进制数据。(If no pseudo-terminal has been allocated, the session is transparent and can be used to reliably transfer binary data.
)
问:如何理解【会话是透明的】呢?
答:网络数据可以不通过伪终端进行中转操作直接写入到对应的程序中。参考 Linux 的伪终端的基本原理 及其在远程登录(SSH,telnet等)中的应用 一文。
参考
man ssh
- 高级 SSH 速查表 | Linux 中国
- liunx常用命令:ssh
- 用好SSH端口转发,会解决很多问题
- SSH隧道介绍与实战
- ssh的简介与常用用法
- SSH常用功能
- ssh和sshd服务
- SSH原理与运用(一):远程登录-阮一峰
- SSH原理与运用(二):远程操作与端口转发-阮一峰
- Linux 的伪终端的基本原理 及其在远程登录(SSH,telnet等)中的应用
- linux mkfifo命令基本用法
- Linux 标准输入输出、管道符、重定向
- linux 伪终端设备 /dev/ptmx
- Linux TTY/PTS概述(转载)
- linux分享之浅谈标准输入输出
- https://askubuntu.com/questions/481906/what-does-tty-stand-for