ssh實現免密碼登錄和文件傳輸


一般的用戶名密碼認證不安全,很容易被暴力破解,還不方便;而大多數人都是選擇使用 SSH 密鑰認證,不僅安全還不用每次輸密碼

ssh密鑰對

# 使用 ssh-keygen 生成非對稱密鑰,一路回車即可 ssh-keygen # 執行完畢之后,會在 ~/.ssh/ 目錄下生成 id_rsa 私鑰、id_rsa.pub 公鑰 # 公鑰是可以公開的,放在你要登錄的 ssh 服務器上(~/.ssh/authorized_keys) # 私鑰不可以公開,自己要保管好,別弄丟了,通常放在 ~/.ssh/id_rsa 默認路徑; # 接下來將公鑰部署到服務器 ## ssh-copy-id 方式(會自動配置好權限) ssh-copy-id USER@SSH_SERVER ## 手動復制方式 scp -Cpr .ssh/id_rsa.pub USER@SSH_SERVER:.ssh/authorized_keys ############################################################
authorized_keys
#############################################################
# 如果 authorized_keys 已經有公鑰了,不能這樣直接復制,需要追加進去 ## 先將生成的公鑰拷貝到服務器上 scp -Cpr .ssh/id_rsa.pub USER@SSH_SERVER:.ssh/tmp_public_key ## 然后登陸到服務器上,添加公鑰 cd ~/.ssh/ echo >> authorized_keys cat tmp_public_key >> authorized_keys # 如果是手動添加的,還需要配置權限 chmod 700 ~/.ssh/ chmod 600 ~/.ssh/id_rsa chmod 600 ~/.ssh/authorized_keys
Bash

ssh自動登錄

# 配置完成后,我們就可以使用 ssh-key 進行登錄了 ssh USER@SSH_SERVER # 還可以配置 ~/.ssh/config,使用別名登錄 vim ~/.ssh/config --- config --- Host Server_A HostName 192.168.1.1 Port 6666 User root IdentityFile ~/.ssh/id_rsa/private_key.a Host Server_B HostName 192.168.2.1 Port 7777 User root IdentityFile ~/.ssh/id_rsa/private_key.b # 使用別名登錄服務器 ssh Server_A ssh Server_B 
Bash

ssh使用代理

連接國外 VPS 時,因為某些原因,ssh 連上了很卡,而且經常失去連接,因此需要讓 ssh 走代理加速

ssh 使用 socks5、http_connect 代理:
ssh -oProxyCommand="nc -X5 -x127.0.0.1:1080 %h %p" USER@SSH_SERVER,通過 socks5 代理
ssh -oProxyCommand="nc -Xconnect -x127.0.0.1:1080 %h %p" USER@SSH_SERVER,通過 http_connect 代理

scp/sftp 使用 socks5、http_connect 代理:
scp -Cpr -oProxyCommand="nc -X5 -x127.0.0.1:1080 %h %p" files USER@SSH_SERVER:/tmp/
scp -Cpr -oProxyCommand="nc -Xconnect -x127.0.0.1:1080 %h %p" files USER@SSH_SERVER:/tmp/
sftp -oProxyCommand="nc -X5 -x127.0.0.1:1080 %h %p" USER@SSH_SERVER
sftp -oProxyCommand="nc -Xconnect -x127.0.0.1:1080 %h %p" USER@SSH_SERVER

如果你使用的是 XShell,也可以設置代理:
屬性 -> 連接 -> 代理 -> 添加、選擇代理服務器 -> 重新連接ssh

 

scp傳輸文件和文件夾

#向遠端傳文件 $ scp [-r] dir/file_name user_name@ip_addr/domain_name:dir #從遠端往本地傳文件 $ scp [-r] user_name@ip_addr/domain_name:dir/file_name dir 

usr_name是用戶名

ip_addr是ip地址

domain_name是域名

當不輸入user_name的時候會默認使用本地用戶名

dir是文件目錄

file_name是文件名

如果傳輸的是文件夾需要加上-r參數,傳送文件不用 

同樣的,每次輸入ip地址或者域名都太復雜了,剛剛的~/.ssh/config文件還在,完全可以執行

$ scp [-r] dir/file_name alias_name:dir $ scp [-r] alias_name:dir/file_name dir # 傳輸到本地時可以使用相對路徑,當前目錄可以用.替代,上級目錄可以用..替代

進行傳送文件。

遠端dir如果值為空,默認傳輸到服務器用戶的家目錄下

$ scp [-r] dir/file_name alias_name: # 等同於# $ scp [-r] dir/file_name alias_name:~
#############################################

有兩台服務器,client端沒有root權限,接收端server有root權限。現在需要從client端免密scp文件到server端。
因為client端沒有.ssh文件夾的訪問權限,所以不能直接使用client端的密鑰,需要從server端生成密鑰文件。
整個流程操作步驟如下:
1、server端生成密鑰,並且把公鑰添加到authorized_keys
2、把私鑰上傳到client端
3、使用scp -i指定密鑰傳輸

# 把本地的 /path/to/local/file 文件傳輸到遠程的 /path/to/remote/file
scp -P port /path/to/local/file user@remote:/path/to/remote/file

# 也可以使用別名
scp /path/to/local/file lab:/path/to/remote/file

# 把遠程的 /path/to/remote/file 下載到本地的 /path/to/local/file
scp lab:/path/to/remote/file /path/to/local/file

# 遠程的默認路徑是家目錄
# 下面命令把當前目錄下的 file 傳到遠程的 ~/dir/file
scp file lab:dir/file

# 加上 -r 命令可以傳送文件夾
# 下面命令可以把當前目錄下的 dir 文件夾傳到遠程的家目錄下
scp -r dir lab:

# 別忘了 . 可以用來指代當前目錄
# 下面命令可以把遠程的 ~/dir 目錄下載到當前目錄里面
scp -r lab:dir/ .

server端配置

生成密鑰對

執行ssh-keygen -t rsa,完成之后在/root/.ssh文件夾可以查看到密鑰對id_rsa為密鑰文件,id_rsa.pub為公鑰文件;
執行cp -rf /root/.ssh/id_rsa.pub /root/.ssh/authorized_keys即可

上傳私鑰

把server端的id_rsa上傳至client端即可

使用scp傳輸

1.命令格式:

scp [參數] [原路徑] [目標路徑]

2.命令功能:

scp是 secure copy的縮寫, scp是linux系統下基於ssh登陸進行安全的遠程文件拷貝命令。linux的scp命令可以在linux服務器之間復制文件和目錄。

3.命令參數:

-1 強制scp命令使用協議ssh1

-2 強制scp命令使用協議ssh2

-4 強制scp命令只使用IPv4尋址

-6 強制scp命令只使用IPv6尋址

-B 使用批處理模式(傳輸過程中不詢問傳輸口令或短語)

-C 允許壓縮。(將-C標志傳遞給ssh,從而打開壓縮功能)

-p 保留原文件的修改時間,訪問時間和訪問權限。

-q 不顯示傳輸進度條。

-r 遞歸復制整個目錄。

-v 詳細方式顯示輸出。scp和ssh(1)會顯示出整個過程的調試信息。這些信息用於調試連接,驗證和配置問題。

-c cipher 以cipher將數據傳輸進行加密,這個選項將直接傳遞給ssh。

-F ssh_config 指定一個替代的ssh配置文件,此參數直接傳遞給ssh。

-i identity_file 從指定文件中讀取傳輸時使用的密鑰文件,此參數直接傳遞給ssh。

-l limit 限定用戶所能使用的帶寬,以Kbit/s為單位。

-o ssh_option 如果習慣於使用ssh_config(5)中的參數傳遞方式,

-P port 注意是大寫的P, port是指定數據傳輸用到的端口號

-S program 指定加密傳輸時所使用的程序。此程序必須能夠理解ssh(1)的選項。

此處用到的就是-i參數
使用前記得把id_rsa權限改成600,權限太大會報錯
scp -i id_rsa auto_feature/featurefile/特征庫* root@172.16.16.199:/HYTF/TD/特征庫文件/第二代特征庫/
備注:
1、此處id_rsa必須與server端的公鑰配對
2、如id_rsa文件放在其他目錄,記得加上路徑

####################################
在平時工作中,有時候需要SSH登陸到別的Linux主機上去,但有時候SSH登陸會被禁止,並彈出如下類似提示: 

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 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 the RSA host key has just been changed.The fingerprint for the RSA key sent by the remote host is36:68:a6:e6:43:34:6b:82:d7:f4:df:1f:c2:e7:37:cc.Please contact your system administrator.Add correct host key in /u/xlian008/.ssh/known_hosts to get rid of this message.Offending key in /u/xlian008/.ssh/known_hosts:2RSA host key for 135.1.35.130 has changed and you have requested strict checking.Host key verification failed. 


比較奇怪,於是研究了一下。 
ssh會把你每個你訪問過計算機的公鑰(public key)都記錄在~/.ssh/known_hosts。當下次訪問相同計算機時,OpenSSH會核對公鑰。如果公鑰不同,OpenSSH會發出警告, 避免你受到DNS Hijack之類的攻擊。我在上面列出的情況,就是這種情況。 

原因:一台主機上有多個Linux系統,會經常切換,那么這些系統使用同一ip,登錄過一次后就會把ssh信息記錄在本地的~/.ssh/known_hsots文件中,切換該系統后再用ssh訪問這台主機就會出現沖突警告,需要手動刪除修改known_hsots里面的內容。 

有以下兩個解決方案: 
1. 手動刪除修改known_hsots里面的內容; 
2. 修改配置文件“~/.ssh/config”,加上這兩行,重啟服務器。 
   StrictHostKeyChecking no 
   UserKnownHostsFile /dev/null 

優缺點: 
1. 需要每次手動刪除文件內容,一些自動化腳本的無法運行(在SSH登陸時失敗),但是安全性高; 
2. SSH登陸時會忽略known_hsots的訪問,但是安全性低;

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM