從零開始搭建伺服器之登錄和登出遠程伺服器
- 2019 年 12 月 1 日
- 筆記
雙 11 期間入手了一台雲伺服器,備案花了一兩個星期,這兩天終於備案通過了.於是在個人伺服器上裝了 Docker
容器用於部署項目,準備盡量把所有的服務都打包成容器,方便統一管理運維.
於是利用 docker
搭建了 nginx
作為反向代理伺服器,負責請求分發,用 nginx
部署靜態部落格,用 mysql
暴露給個人項目使用…
但是千里之行始於足下,一切還要從登錄登出遠程伺服器開始,本文基於 Centos7.6
環境,不保證其他環境正常.
環境準備
伺服器要求
如果你已經有云伺服器或者虛擬機伺服器,首先需要驗證伺服器上是否已經安裝 ssh
服務,如果沒有安裝則需要提前安裝.
登錄伺服器後,在命令行窗口中輸入 rpm -qa | grep ssh
查看是否包括 ssh
相關文件.
[root@snowdreams1006 ~]# rpm -qa | grep ssh openssh-clients-7.4p1-16.el7.x86_64 libssh2-1.4.3-12.el7_6.2.x86_64 openssh-server-7.4p1-16.el7.x86_64 openssh-7.4p1-16.el7.x86_64
默認情況下運行 netstat -antp | grep sshd
命令,可以看到 sshd
服務監聽的埠正是默認的 22
埠.
[root@snowdreams1006 ~]# netstat -antp | grep sshd tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1051/sshd tcp 0 0 *.*.*.*:22 *.*.*.*:46797 ESTABLISHED 17334/sshd: root@pt
其實一般雲伺服器均已預裝好 ssh
服務,如果沒有上述輸出,則說明可能並沒有安裝 ssh
服務,可以使用 yum install openssh-server
進行安裝.
下面總結一些關於 sshd
的常用命令,如下
- 查看
sshd
運行狀態
systemctl status sshd
如果運行結果包括 Active: active (running)
則證明 sshd
服務處於激活狀態,如果是 Active: inactive (dead)
則表示服務已關閉.
[root@snowdreams1006 ~]# systemctl status sshd ● sshd.service - OpenSSH server daemon Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled) Active: active (running) since 五 2019-11-29 21:05:08 CST; 16h ago Docs: man:sshd(8) man:sshd_config(5) Main PID: 1051 (sshd) Tasks: 1 Memory: 10.9M CGroup: /system.slice/sshd.service └─1051 /usr/sbin/sshd -D
- 啟動|關閉|重啟
sshd
服務
systemctl start sshd
> 針對處於已經關閉 sshd
狀態時,可以再次啟動,如果已經啟動,則不會輸出結果,但還是啟動中.
systemctl stop sshd
> 針對處於正在運行 sshd
狀態時,可以停止服務,如果已經停止,則不會輸出結果,但還是停止中.
systemctl restart sshd
> 針對處於正在運行 sshd
狀態或者已經停止狀態時,可以重啟服務,雖然都不會輸出結果,但已經啟動.
- 開機自啟|禁止自啟
sshd
服務
systemctl list-unit-files | grep enabled
> 查看全部開機自啟服務,如果包括 sshd
則表示 sshd
已加入開機自啟服務,如果沒有則不會開機自啟.
systemctl list-unit-files | grep enabled | grep sshd
> 如果全部開機自啟服務比較多的話,肉眼不太直接看出 sshd
是否自啟,在上一條命令的基礎上多加一個 grep sshd
即可過濾是否包含 sshd
服務.
systemctl enable sshd
> 開機自啟服務,如果某些服務非常重要需要一直後台運行的話,最好加入開機自啟,這樣能防止意外關機重啟伺服器後忘記開啟服務,比如 sshd
服務和 docker
服務等等.
systemctl disable sshd
> 針對已經開機自啟服務進行禁用,運行 systemctl list-unit-files | grep enabled | grep sshd
可以查看當前服務是否會開機自啟.
如果你現在還沒有伺服器但又想學習體驗一下,要麼立即花錢去買伺服器要麼免費安裝虛擬機,或者先收藏起來以後再看!
針對立即購買伺服器的小夥伴,請私信聯繫我,用我的推廣鏈接購買,你有優惠,我有分成,何樂而不為呢?
> 在 Mac
電腦已經裝好 VMware
虛擬機的基礎上,裝個 Centos
鏡像就擁有了自己的 Centos
伺服器.
客戶端要求
因為登錄伺服器需要使用到 ssh
協議,所以首先需要驗證本機客戶端命令行是否支援 ssh
協議.
打開你正在使用的命令行,直接輸入 ssh
如果有下列提示證明是可以的,如果沒有請安裝支援 ssh
協議命令行終端.
如果你是 Mac
用戶,打開默認的 terminal
終端輸入 ssh
返回用法說明,證明是支援 ssh
協議的.
snowdreams1006$ ssh usage: ssh [-46AaCfGgKkMNnqsTtVvXxYy] [-B bind_interface] [-b bind_address] [-c cipher_spec] [-D [bind_address:]port] [-E log_file] [-e escape_char] [-F configfile] [-I pkcs11] [-i identity_file] [-J [user@]host[:port]] [-L address] [-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port] [-Q query_option] [-R address] [-S ctl_path] [-W host:port] [-w local_tun[:remote_tun]] destination [command]
> Mac
自帶的 terminal
終端是支援 ssh
協議的,Windows
的 Git Bash
命令行也是支援的!
如果你是 Windows
用戶正在使用 cmd
命令行窗口,很遺憾並不支援 ssh
協議,請自行選擇類 unix
終端進行操作.
Microsoft Windows [版本 6.1.7601] 版權所有 (c) 2009 Microsoft Corporation。保留所有權利。 C:UsersAdministrator>ssh 'ssh' 不是內部或外部命令,也不是可運行的程式 或批處理文件。 C:UsersAdministrator>
> Windows
用戶不妨安裝 Git for Windows ,默認自帶的 Git Bash
命令行就很好用,比 cmd
終端更加簡單優雅,給你一種類 unix
操作體驗.
命令行登錄
ssh
登錄伺服器前提是知道帳號密碼,先用密碼登錄的方式進行設置,然後才能用 ssh
方式進行免密登錄.
一般情況下,密碼都是自己設置的,如果不清楚默認密碼是多少可以詢問雲伺服器廠商或者選擇重設密碼,這裡不再贅述,假設你已經知道伺服器密碼並且知道伺服器公網 ip.
下面我們將會在本機客戶端的命令行中遠程登錄雲伺服器,從最簡單方便的密碼登錄到無密碼的密鑰登錄再到最後的別名登錄,快點跟著我一起動起來吧!
> 友情提示: 請確保服務端已開啟 sshd
服務和本地客戶端命令行中支援 ssh
協議,否則還是先收藏起來以後再看吧!
密碼登錄
打開熟悉的命令行終端,運行 ssh <登錄帳號>@<伺服器公網 ip>
命令直接登錄遠程雲伺服器.
$ ssh [email protected] @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! Someone could be eavesdropping on you right now (man-in-the-middle attack)! It is also possible that a host key has just been changed. The fingerprint for the ECDSA key sent by the remote host is SHA256:/RJ5aI+c41Brr1dcBMhdNHQJa7daP+8fbupqsGmHRHc. Please contact your system administrator. Add correct host key in /c/Users/Administrator/.ssh/known_hosts to get rid of this message. Offending ECDSA key in /c/Users/Administrator/.ssh/known_hosts:5 ECDSA host key for 121.40.223.69 has changed and you have requested strict checking. Host key verification failed.
> 因為我的域名 snowdreams1006.cn
已經備案成功並且做了域名解析,所以這裡我可以直接用域名而不是 ip
,說白了還是因為懶,誰讓 ip
記不住呢!
如果你沒有遇到上述提示,恭喜你,可以接著輸入帳號密碼就可以登錄到伺服器了!
如果你和我一樣遇到這種問題,很可能是之前登陸過伺服器,不過後來伺服器又重裝系統,導致無法登錄,可以清除本機 ~/.ssh/known_hosts
重新登錄.
rm -rf ~/.ssh/known_hosts
強制刪除 ~/.ssh/known_hosts
文件後重新 ssh [email protected]
登錄到遠程雲伺服器,按照提示選擇繼續連接 yes
,然後輸入自己的密碼 password
,登錄成功後默認進入到家目錄.
$ ssh [email protected] The authenticity of host 'snowdreams1006.cn (*.*.*.*)' can't be established. ECDSA key fingerprint is SHA256:/**********************************. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added 'snowdreams1006.cn,*.*.*.*' (ECDSA) to the list of known hosts. [email protected]'s password: Last login: *** from *.*.*.* Welcome to Alibaba Cloud Elastic Compute Service ! [root@snowdreams1006 ~]#
來都來了,不留下點什麼東西不好不意思跟別人說過自己曾將來過,那就隨便意思意思好了.
- 悟空到此一游
[root@snowdreams1006 ~]# whoami root
> whoami
我是誰: 查看正在登錄用戶名稱
[root@snowdreams1006 ~]# pwd /root
> pwd
我在哪: 列印當前目錄路徑
[root@snowdreams1006 ~]# who -u root tty1 2019-11-29 21:05 舊的 596 root pts/0 2019-11-30 14:15 . 17506 (115.217.243.122) root pts/1 2019-11-30 14:28 00:05 17533 (115.217.243.122)
> who -u
還有誰: 列印系統登錄用戶
[root@snowdreams1006 ~]# last -a | head -6 root pts/1 Sat Nov 30 14:28 still logged in 115.217.243.122 root pts/0 Sat Nov 30 14:15 still logged in 115.217.243.122 root pts/0 Sat Nov 30 13:10 - 13:51 (00:41) 115.217.243.122 root pts/0 Sat Nov 30 12:24 - 12:25 (00:00) 115.217.243.122 root pts/1 Fri Nov 29 22:08 - 23:12 (01:03) 112.17.241.55 root pts/0 Fri Nov 29 21:33 - 22:13 (00:39) 112.17.241.55
> last -a | head -6
最後是誰: 列印最後登錄用戶
- 好像不認識你
如果發現登錄用戶除了自己還有別人或者不記得自己其他終端登陸過沒有退出,這時候應該踢出這些登錄終端.
如果要踢出別人,首先要自己登錄的終端終端中哪個是自己,不能自己把自己踢了,那就好笑了!
whoami
僅僅列印登錄名,沒有登錄終端資訊,但是 who am i
展示資訊就相對多了,這裡要記住當前用戶登錄終端的名稱!
[root@snowdreams1006 ~]# who am i root pts/0 *** (*.*.*.*)
> who am i
: 我是誰,比 whoami
顯示的資訊更多.
who -u
可以展示全部登錄用戶,不過這裡推薦使用 w
查看登錄用戶終端資訊,因為敲入的命令更少!
[root@snowdreams1006 ~]# w 14:53:04 up 17:48, 3 users, load average: 0.00, 0.01, 0.05 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root tty1 五21 17:46m 0.00s 0.00s -bash root pts/0 115.217.243.122 14:15 0.00s 0.81s 0.00s w root pts/1 115.217.243.122 14:51 1:37 0.00s 0.00s -bash
> who -u
和 w
都可以查看登錄用戶終端資訊,pts/0
是當前登錄終端,其他終端 pts/1
就可以被踢掉了.
# pkill -kill -t pts/1
> pkill -kill -t pts/<序號>
踢出登錄終端後,被踢出的終端則會自動退出顯示連接已關閉.
[root@snowdreams1006 ~]# w 14:58:46 up 17:53, 2 users, load average: 0.00, 0.01, 0.05 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root tty1 五21 17:52m 0.00s 0.00s -bash root pts/0 115.217.243.122 14:15 6.00s 0.83s 0.00s w
> w
: 有誰,踢出其他終端後再次查看登錄終端發現確實沒有 pts/1
了,證明操作成功!
- 回家洗洗睡吧
登錄到伺服器查看了一些資訊,並成功踢出了其他終端,天已經黑了,是時候洗洗睡了,這時候需要退出伺服器回到本地客戶端的命令行.
[root@snowdreams1006 ~]# exit 登出 Connection to ssh.snowdreams1006.cn closed.
> 除了敲入命令 exit
還可以敲入快捷鍵 Ctrl+D
退出連接.
密鑰登錄
一般來說,使用密碼登錄的方式更加適合不常用的場合,偶爾用終端登錄一下沒什麼問題,如果是經常性需要登錄到遠程伺服器的話,每次連接都需要登錄就比較費事了.
既然不用密碼登錄,那怎麼證明自己的身份以保證合法性登錄請求呢?
這裡就要用到密鑰代替密碼進行登錄,首先在本機客戶端生成一種認證資訊,然後將這種認證資訊安裝到遠程伺服器中,只要完成這種操作就意味著下一次來自該客戶端的登錄請求都是合法的,不然服務端怎麼會有你的認證資訊?
所以,可以猜想的是,即使是相同的帳號,如果使用的是不同的認證資訊,那麼遠程伺服器還是會已保存的認證資訊為準,比如你的 Mac
已經實現免密登錄,但是你的 Windows
由於並沒有上傳自己的認證資訊,所以免密登錄只對 Mac
有效!
當然,如果 Mac
和 Windows
電腦的認證資訊是一樣的,那麼伺服器保存一份是不是可以免密登錄了呢?
答案是: 正確的!
由此可見,密鑰登錄是針對終端設備而言的,特別適合常用的終端,偶爾性的電腦前往不要設置密鑰,不然哪天你忘記了,人家都能直接登錄你的伺服器,多可怕!
所以,要完成免密登錄,需要兩個操作,一是本地客戶端生成認證文件,二是遠程伺服器保存該認證文件.
- 本地客戶端生成公鑰
$ cat ~/.ssh/id_rsa.pub ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC0gC0u4gR4oba4oHS59Tcc4eAVkaJHsCmys0v4IupoSLQKkdUJVxSfkmL5JZEkr7JNySD7Y52ukRcxx1ZMW0oK7lq+FvfEwzIfAOqVoM4bCoh2D/iC6Xf43ilxCM6oMhpWyITGtxPVzW/ZmmxRGcQzeVrrvoSLhOt0+L0rvFuiQZmnhkV0zqGTRKTQ5uEKycigfdItEaHFIg9fMxugN/bgeflJoEBZjAJHXkqd0mq/4AqeAbkoruEz6D+OiqBhoN8CsbaPCaccMoKd8Tze5UszC3PsQWo96nQoXMXk7HYoFwvJCAgAfKP0CaTwGEK/D7SFvXm3UMlFwAHxELr2bbTv [email protected]
> ~/.ssh/id_rsa.pub
文件被稱為公鑰,即用於發送給伺服器的認證文件,可以公開到互聯網,只要伺服器保存該公鑰,那麼生成該公鑰的本地客戶端就能免密連接到伺服器.
如果你的本地客戶端沒有該文件,可以使用 ssh-keygen -t rsa
生成一份,按照提示輸入相關的資訊即可,然後再次運行 cat ~/.ssh/id_rsa.pub
就能查看公鑰文件的具體內容了.
- 遠程伺服器接收公鑰
本地客戶端將自己的公鑰文件內容追加到遠程伺服器的授權文件中就能完成免密登錄,那麼問題來了,公鑰文件保存在哪呢?
答案是: ~/.ssh/authorized_keys
[root@snowdreams1006 ~]# cat ~/.ssh/authorized_keys ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC0gC0u4gR4oba4oHS59Tcc4eAVkaJHsCmys0v4IupoSLQKkdUJVxSfkmL5JZEkr7JNySD7Y52ukRcxx1ZMW0oK7lq+FvfEwzIfAOqVoM4bCoh2D/iC6Xf43ilxCM6oMhpWyITGtxPVzW/ZmmxRGcQzeVrrvoSLhOt0+L0rvFuiQZmnhkV0zqGTRKTQ5uEKycigfdItEaHFIg9fMxugN/bgeflJoEBZjAJHXkqd0mq/4AqeAbkoruEz6D+OiqBhoN8CsbaPCaccMoKd8Tze5UszC3PsQWo96nQoXMXk7HYoFwvJCAgAfKP0CaTwGEK/D7SFvXm3UMlFwAHxELr2bbTv [email protected]
這裡可以看出,遠程伺服器的 ~/.ssh/authorized_keys
內容包含了本地客戶端的 ~/.ssh/id_rsa.pub
公鑰內容.
所以接下來的動作就是複製粘貼的操作,複製本地客戶端的 ~/.ssh/id_rsa.pub
公鑰文件內容,粘貼到遠程伺服器的 ~/.ssh/authorized_keys
文件中.
只不過這裡需要用到 vim
操作,這也是對於新手來說唯一的挑戰了,但是我們還有神器來簡化這種複製粘貼操作!
那就是: ssh-copy-id [email protected]
首先確保本地客戶端已經生成公鑰,這裡查看一下公鑰文件的內容: cat ~/.ssh/id_rsa.pub
$ cat ~/.ssh/id_rsa.pub ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC1UGGBXbqINEfQNCweCOWDlqvRfw3iIqkX9UnI71GgyJkkPUZbycw3L4dVeBkpo76OJjJhJmsAGbHAuhYLloqoNjD9+c/hk7vgP0uZHqVXehqKuP5VvOOkqeLXZkjdXQ49MhARHBVm1LaD44iOOneYclSPiRjKs+6eCxU9SQp+dVUcZMrbAE1lktGgDQEkjtFl8BE9BQkCU24r8xcOUix4iZgdDIa5gnE9YLg1rNXO6LgQG61JLvErrc2g7KkkR4i2P1R+0uV3KdYyMv8Y2aYwYGqY1PjqXUVfaJjTor4Dr8HHBp4VHE3kNVZitLJ2S7RFYuYGFXTEX0xmi6o1r5xP Administrator@snowdreams1006
這裡是 Windows
電腦,演示前並沒有配置免密登錄,所以執行完 ssh-copy-id [email protected]
應該也像 Mac
電腦一樣支援免密登錄.
$ ssh-copy-id [email protected] /usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/c/Users/Administrator/.ssh/id_rsa.pub" /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys [email protected]'s password: Number of key(s) added: 1 Now try logging into the machine, with: "ssh '[email protected]'" and check to make sure that only the key(s) you wanted were added.
這裡接著用已經免密登錄到遠程伺服器的 Mac
電腦驗證一下,Windows
電腦的公鑰是否已經添加到遠程伺服器的 ~/.ssh/authorized_keys
.
[root@snowdreams1006 ~]# cat ~/.ssh/authorized_keys ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC0gC0u4gR4oba4oHS59Tcc4eAVkaJHsCmys0v4IupoSLQKkdUJVxSfkmL5JZEkr7JNySD7Y52ukRcxx1ZMW0oK7lq+FvfEwzIfAOqVoM4bCoh2D/iC6Xf43ilxCM6oMhpWyITGtxPVzW/ZmmxRGcQzeVrrvoSLhOt0+L0rvFuiQZmnhkV0zqGTRKTQ5uEKycigfdItEaHFIg9fMxugN/bgeflJoEBZjAJHXkqd0mq/4AqeAbkoruEz6D+OiqBhoN8CsbaPCaccMoKd8Tze5UszC3PsQWo96nQoXMXk7HYoFwvJCAgAfKP0CaTwGEK/D7SFvXm3UMlFwAHxELr2bbTv [email protected] ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC1UGGBXbqINEfQNCweCOWDlqvRfw3iIqkX9UnI71GgyJkkPUZbycw3L4dVeBkpo76OJjJhJmsAGbHAuhYLloqoNjD9+c/hk7vgP0uZHqVXehqKuP5VvOOkqeLXZkjdXQ49MhARHBVm1LaD44iOOneYclSPiRjKs+6eCxU9SQp+dVUcZMrbAE1lktGgDQEkjtFl8BE9BQkCU24r8xcOUix4iZgdDIa5gnE9YLg1rNXO6LgQG61JLvErrc2g7KkkR4i2P1R+0uV3KdYyMv8Y2aYwYGqY1PjqXUVfaJjTor4Dr8HHBp4VHE3kNVZitLJ2S7RFYuYGFXTEX0xmi6o1r5xP Administrator@snowdreams1006
可以看到,遠程伺服器已經保存了 Windows
電腦剛剛上傳的公鑰文件內容,所以說 ssh-copy-id
簡直就是神器,再也不用手動複製粘貼公鑰了!
至於登陸後可以做什麼,我想你還是可以到此一游,順便再踢出其他終端之類的,最後別忘了退出登錄 exit
命令喲!
別名登錄
無論是密碼登錄還是密鑰登錄,我們都是採用 ssh
協議進行登錄,而密鑰登錄的配置也是依賴於密碼登錄,不管怎麼說,兩者敲入的命令都不少!
怎不能快速登錄呢?
答案是: 可以的!
既然想要快速登錄,但是登錄資訊肯定是必不可少的,所以無外乎是將必要的登錄資訊寫到配置文件中,登錄時再讀取配置文件進行登錄.
原理很好理解,關鍵是實現過程需要我們自己去實現么?
幸運的是: 不需要!
同樣地,編輯 ssh
的配置文件設置一些登錄資訊即可,配置文件的位於 ~/.ssh/config
.
Host <主機 id> User <登錄帳號> HostName <主機名稱>
按照上述格式,將登錄資訊配置如下:
Host github.com User snowdreams1006 Hostname ssh.github.com Host snowdreams1006.cn User root Hostname ssh.snowdreams1006.cn
其中 Host
是對外暴露的唯一標識,通過 Host
就可以代替帳號和 ip 了,兩個變成一個是不是簡化了呢?
原來的登錄命令是 ssh <登錄帳號>@<伺服器公網 ip>
而現在則是 ssh <主機 id>
$ ssh snowdreams1006.cn Last login: **** from *.*.*.* Welcome to Alibaba Cloud Elastic Compute Service ! [root@snowdreams1006 ~]#
圖形化登錄
推薦 SecureCRT
圖形化工具遠程連接 Linux
實例,圖形化工具基本上很容易上手,配置一下就可以登錄成功了,這裡已 Windows
電腦為例演示一下相關過程.
首次登錄後會彈出快速連接配置,基本上是關於服務域名埠之類的,並沒有密碼的配置項.

點擊連接後會彈出是否加入主機指紋之類的,選擇接受並保存.

輸入密碼後選擇確定,過一會就連接到伺服器了.

來都來了,還是隨便敲個命令再走吧!

雲服務登錄
登錄控制台找到 ECS 伺服器
,然後找到自己的雲伺服器,因此遠程連接->連接密碼->用戶名/密碼,然後就可以登錄成功了!

回顧總結
密碼登錄和密鑰登錄兩者均存在適合場景,如果覺得密碼登錄不安全的話,也可以禁用密碼登錄只保留密鑰登錄!
遠程登錄到伺服器,找到 /etc/ssh/ssh_config
文件並編輯如下內容來禁用密碼登錄.
Host * PasswordAuthentication no
- 密碼登錄
$ ssh <登錄帳號>@<伺服器公網 ip>
> ssh [email protected]
- 密鑰登錄
$ ssh <登錄帳號>@<伺服器公網 ip>
> ssh [email protected]
- 簡化登錄
$ ssh <主機 id>
> ssh snowdreams1006.cn