概要
SSH 是傳輸層和應用層上的安全協(xié)議,它只能通過加密連接雙方會話的方式來保證連接的安全性。
當使用 ssh 客戶端工具連接成功后,將建立客戶端和服務端之間的會話,該會話是被加密的,之后客戶端和服務端的通信都將通過會話傳輸。
SSH 服務的守護進程為
sshd,默認監(jiān)聽在22端口上。
所有 ssh 客戶端工具,包括 ssh 命令,scp,sftp,ssh-copy-id 等命令都是借助于 ssh 連接來完成任務的。
也就是說它們都連接服務端的 22 端口,只不過連接上之后將待執(zhí)行的相關命令轉(zhuǎn)換傳送到遠程主機上,由遠程主機執(zhí)行。
登錄到目標機器
ssh [-p port] destination
-p port 選項指定遠程 sshd 監(jiān)聽的端口。
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客戶端還是服務端創(chuàng)建? - (2)
ssh是否分配偽終端的區(qū)別是什么?
解答:
- (1) 偽終端的介紹請參考: Linux 的偽終端的基本原理 及其在遠程登錄(SSH,telnet等)中的應用
- (2)偽終端在
ssh服務端創(chuàng)建 - (3)不分配偽終端,會導致一些需要
tty的命令無法正常使用。比如vim
ssh 命令存在兩種基本模式,一是登錄到遠程機器,二是在遠程機器上執(zhí)行代碼。
登錄模式
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 的分配。
執(zhí)行不需要 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
此時執(zhí)行 vim 命令(需要一個 tty 偽終端)會出現(xiàn)如下所示的錯誤:
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。
我們通過【命令模式】執(zhí)行 vim 命令會出現(xiàn)上文同樣的錯誤。
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.
此時可以正常執(zhí)行 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,我們還可以得知:如果未分配偽終端,則該會話是透明的,可用于可靠地傳輸二進制數(shù)據(jù)。(If no pseudo-terminal has been allocated, the session is transparent and can be used to reliably transfer binary data.)
問:如何理解【會話是透明的】呢?
答:網(wǎng)絡數(shù)據(jù)可以不通過偽終端進行中轉(zhuǎn)操作直接寫入到對應的程序中。參考 Linux 的偽終端的基本原理 及其在遠程登錄(SSH,telnet等)中的應用 一文。
參考
man ssh- 高級 SSH 速查表 | Linux 中國
- liunx常用命令:ssh
- 用好SSH端口轉(zhuǎn)發(fā),會解決很多問題
- SSH隧道介紹與實戰(zhàn)
- ssh的簡介與常用用法
- SSH常用功能
- ssh和sshd服務
- SSH原理與運用(一):遠程登錄-阮一峰
- SSH原理與運用(二):遠程操作與端口轉(zhuǎn)發(fā)-阮一峰
- Linux 的偽終端的基本原理 及其在遠程登錄(SSH,telnet等)中的應用
- linux mkfifo命令基本用法
- Linux 標準輸入輸出、管道符、重定向
- linux 偽終端設備 /dev/ptmx
- Linux TTY/PTS概述(轉(zhuǎn)載)
- linux分享之淺談標準輸入輸出
- https://askubuntu.com/questions/481906/what-does-tty-stand-for