ssh 命令詳解

概要

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ū)別是什么?

解答:

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等)中的應用 一文。

參考

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容