linux 使用ssh到遠端並且使用while的坑

2021-09-07 03:55:13 字數 1117 閱讀 5255

如果要使用ssh批量登入到其它系統上操作時,我們會採用迴圈的方式去處理,那麼這裡存在乙個巨大坑,你必須要小心了。

現在是想用乙個指令碼獲取遠端伺服器端/root下面的檔案:

1

#!/bin/bash

23 cat 'ip

.txt

'|while

read line;do

4echo $line

5 access=`ssh $line "

ls /root/

"`

6 done

結果: 指令碼只對第乙個ip做了檢測,就直接跳迴圈。  

問題分析:

while使用重定向機制,ip.txt檔案中的資訊都已經讀入並重定向給了整個while語句,所以當我們在while迴圈中再一次呼叫read語句,就會讀取到下一條記錄。問題就出在這裡,ssh語句正好回讀取輸入中的所有東西。為了禁止ssh讀所有東西增加乙個< /dev/null,將ssh 的輸入重定向輸入。

解決策略:

1、使用for迴圈代表while,因為for沒有一次把檔案內容快取獲取過來,**段修改如下:

1

for ip in

`cat ip.txt`; do

2echo $ip

3 access=`ssh $ip   "

ls /root/ "`

4echo $access

5 done

2、若堅持使用while迴圈,那麼需要對ssh增加-n引數,為什麼增加了-n引數也可以解決問題呢?通過man ssh檢視-n引數的說明

redirects stdin from /dev/null (actually, prevents reading from stdin)

1

#!/bin/bash

23 cat '

ip.txt

'|while

read line;do

4echo $line

5 access=`ssh -n $line "

ls /root/ "`

6 done

linux使用ssh免密碼遠端登陸到別的機子

1 在你的自己的機器 主控端 下面使用ssh keygen命令來實現建立公鑰,使用 ssh keygen t rsa 來建立,程式會問你存放的目錄,如果不需要修改,直接回車幾次即可 2 將你 ssh目錄中的id rsa.pub這個檔案拷貝到你要登入的伺服器 被控端 的 ssh目錄中,然後再執行以下命...

Linux使用scp遠端拷貝使用ssh免密登入

linux使用scp遠端拷貝使用ssh免密登入 需求實現不同伺服器之間互傳檔案 scp命令 18.1.命令格式 scp 引數 原路徑 目標路徑 18.2.命令引數 1 強制scp命令使用協議ssh1 2 強制scp命令使用協議ssh2 4 強制scp命令只使用ipv4定址 6 強制scp命令只使用i...

Linux下使用SSH進行遠端登入

1.介紹 首先ssh是什麼?ssh secure shell 是linux unix mac及其他網路裝置最常用的遠端cli管理協議,ssh使用秘鑰對資料進行加密,保證了遠端管理資料的安全性。ssh2是現在廣泛使用的ssh版本 ssh協議使用tcp協議,埠號為22 openssh是ssh的乙個開源程...