公鑰機腳本
① 在腳本中使用ssh時的幾個注意事項
1. 超時設置
-o ConnectTimeout=3
2. 重定項標准輸入到/dev/null
-n
當使用這樣的形式時 (使用 key 認證):
while read line ; do ip=$(awk '{print $1}' < << $line ) ssh -n -o ConnectTimeout=3 $i uptime done < file
假如此時不使用 -n ,則只有第一行會被處理。
3. 批處理模式,在腳本中使用再合適不過(使用 key 認證)
-o BatchMode=yes
當 key 認證不成功時,有可能會彈出「密碼認識」,從而影響腳本運行下去,此時可以打開 BatchMode模式。
4. 遇到未知主機:
-o StrictHostKeyChecking=no
當遇到未知的主機公鑰時,自動接受key。
5. 糟遇遠程主機連接後無響應:
當設置了 BatchMode 時 ServerAliveInterval 默認被設置成 300 秒(服務端無數據傳回的持續時間)。
ServerAliveCountMax相當於是重試的次數,比如下面的例子,15秒 x 3 = 45 秒,即當 45 秒後,真正超時斷開。
TCPKeepAlive打開時,便於發現網路的斷開。當網路故障(比如路由器壞掉)或者遠端開機、死機時,連接會主動斷開,否則的話,將會等待相當一段時間後才會斷開。
-o ServerAliveInterval=15
-o ServerAliveCountMax=3
-o TCPKeepAlive=yes
需要注意的是,這里的超時、無響應,僅是 ssh或者sshd無影響,假如是在遠程上執行程序,程序無響應,則不能處理此時的超時,解決方法見《在Shell中實現非同步》。
② 如何生成公鑰id
1. 生成公鑰
首先檢查本機公鑰:
$ cd ~/.ssh
如果提示:No such file or directory 說明你是第一次使用git。如果不是第一次使用,請執行下面的操作,清理原有ssh密鑰。
$ mkdir key_backup$ cp id_rsa* key_backup$ rm id_rsa*
生成新的密鑰:
$ ssh-keygen -t rsa -C 「您的郵箱地址」
在回車中會提示你輸入一個密碼,這個密碼會在你提交項目時使用,如果為空的話提交項目時則不用輸入。
您可以在你本機系統盤下,您的用戶文件夾里發現一個.ssh文件,其中的id_rsa.pub文件里儲存的即為剛剛生成的ssh密鑰。
2. 添加公鑰
登錄CODE平台,進入用戶「賬戶設置」,點擊右側欄的「ssh公鑰管理」,點擊「添加公鑰」,將剛剛生成的公鑰填寫到「公鑰」欄,並為它起一個名稱,保存即可。
注意:復制公鑰時不要復制多餘的空格,否則可能添加不成功。
我碰到的一個項目:有些時候,需要在你生成的.ssh目錄下,新建個config文件,然後裡面寫入user xxx
3. 管理公鑰
您也可以在「賬戶設置」——「ssh公鑰管理」刪除或者修改公鑰。
③ linux中使用shell腳本訪問sftp伺服器,密鑰不會用
密鑰用於建立SSH互信環境,本地公鑰需要分發到遠端伺服器目錄,可實現本地主機到遠端SFTP伺服器的無訪問.
1. 生成密鑰對,取得本地公鑰,如:id_dsa.pub
2. 登錄到遠端SFTP伺服器用戶HOME目錄的.ssh文件夾
3. 將id_dsa.pub的內容追加到遠端伺服器.ssh/autorized_keys文件尾部並保存
4. 嘗試與本地主機用戶SFTP到遠程伺服器: sftp user@server_addr
④ linux系統,多台機器ssh免密碼登錄同一台機器執行某個腳本,不需要expect
A B C三台機器上以當前用戶運行如下命令生成本主機的公鑰和私鑰文件:
ssh-keygen-trsa
上述命令執行後,目錄~/.ssh下會出現兩個文件:id_rsa和id_rsa.pub。其中,id_rsa.pub為公鑰文件。將該文件的內容追加到主機D上~/.ssh目錄下的authorized_keys文件中。例如:
A機將id_rsa.pub文件傳到D機:
scp~/.ssh/id_rsa.pubuser@HOSTD:/tmp/id_rsa_HOSTA.pub
D機user用戶追加authorized_keys文件:
cat/tmp/id_rsa_HOSTA.pub>>~/.ssh/authorized_keys
接下來,就可以在不輸入密碼的情況下在遠程主機私執行命令了。命令格式如下:
ssh 遠程用戶名@遠程主機名或IP地址 '遠程命令或者腳本'
例如:
sshuser@HOSTD'hostname'
sshuser@HOSTD'/home/user/script/test.sh'
需要特別注意的是:當遠程腳本中使用了一些命令識別依賴於環境變數時,該腳本需要在其第一行中包含執行profile文件的命令。比如,在Bash中,該腳本的第一行為:
source~/.bash_profile
否則,遠程腳本可能報錯。
⑤ 如何生成ssh公鑰
1. 生成公鑰
首先檢查本機公鑰:
$ cd ~/.ssh
如果提示:No such file or directory 說明你是第一次使用git。如果不是第一次使用,請執行下面的操作,清理原有ssh密鑰。
$ mkdir key_backup$ cp id_rsa* key_backup$ rm id_rsa*
生成新的密鑰:
$ ssh-keygen -t rsa -C 「您的郵箱地址」
在回車中會提示你輸入一個密碼,這個密碼會在你提交項目時使用,如果為空的話提交項目時則不用輸入。
您可以在你本機系統盤下,您的用戶文件夾里發現一個.ssh文件,其中的id_rsa.pub文件里儲存的即為剛剛生成的ssh密鑰。
2. 添加公鑰
登錄CODE平台,進入用戶「賬戶設置」,點擊右側欄的「ssh公鑰管理」,點擊「添加公鑰」,將剛剛生成的公鑰填寫到「公鑰」欄,並為它起一個名稱,保存即可。
注意:復制公鑰時不要復制多餘的空格,否則可能添加不成功。
我碰到的一個項目:有些時候,需要在你生成的.ssh目錄下,新建個config文件,然後裡面寫入user xxx
3. 管理公鑰
您也可以在「賬戶設置」——「ssh公鑰管理」刪除或者修改公鑰。
⑥ 怎樣實現對私鑰(公鑰)進行解密
要實現安全登錄,可以採用下面三種方法,一種基於非對稱加密演算法,一種基於對稱加密演算法,最後一種基於散列演算法。下面我們來分別討論這三種方法。
非對稱加密演算法中,目前最常用的是 RSA 演算法和 ECC(橢圓曲線加密)演算法。要採用非對稱加密演算法實現安全登錄的話,首先需要在客戶端向伺服器端請求登錄頁面時,伺服器生成公鑰和私鑰,然後將公鑰隨登錄頁面一起傳遞給客戶端瀏覽器,當用戶輸入完用戶名密碼點擊登錄時,登錄頁面中的 JavaScript 調用非對稱加密演算法對用戶名和密碼用用公鑰進行加密。然後再提交到伺服器端,伺服器端利用私鑰進行解密,再跟資料庫中的用戶名密碼進行比較,如果一致,則登錄成功,否則登錄失敗。
看上去很簡單,但是這里有這樣幾個問題。目前 RSA 演算法中,1024-2048 位的密鑰被認為是安全的。如果密鑰長度小於這個長度,則認為可以被破解。但這樣的長度超過了程序設計語言本身所允許的數字運算范圍,需要通過模擬來實現大數運算。而在 Web 系統的客戶端,如果通過 JavaScript 來模擬大數運行的話,效率將會是很低的,因此要在客戶端採用這樣的密鑰來加密數據的話,許多瀏覽器會發出執行時間過長,停止運行的警告。然而,解密或者密鑰生成的時間相對於加密來說要更長。雖然解密和密鑰生成是在伺服器端執行的,但是如果伺服器端是 PHP、ASP 這樣的腳本語言的話,它們也將很難勝任這樣的工作。ECC 演算法的密鑰長度要求比 RSA 演算法要低一些,ECC 演算法中 160 位的密鑰長度被認為與 RSA 演算法中 1024 位的密鑰長度的安全性是等價的。雖然仍然要涉及的模擬大數運算,但 ECC 演算法的密鑰長度的運算量還算是可以接受的,但是 ECC 演算法比 RSA 演算法要復雜的多,因此實現起來也很困難。
對稱加密演算法比非對稱加密演算法要快得多,但是對稱加密演算法需要數據發送方和接受方共用一個密鑰,密鑰是不能通過不安全的網路直接傳遞的,否則密鑰和加密以後的數據如果同時監聽到的話,入侵者就可以直接利用監聽到的密鑰來對加密後的信息進行解密了。
那是不是就不能通過對稱加密演算法實現安全登錄呢?其實只要通過密鑰交換演算法就可以實現安全登錄了,常用的密鑰交換演算法是 Diffie-Hellman 密鑰交換演算法。我們可以這樣來實現密鑰的安全傳遞,首先在客戶端向伺服器端請求登錄頁面時,伺服器端生成一個大素數 p,它的本原根 g,另外生成一個隨機數 Xa,然後計算出 Ya = gXa mod p,將 p、g、Ya 連同登錄頁面一起發送給客戶端,然後客戶端也生成一個隨機數 Xb,計算 Yb = gXb mod p,然後再計算 K = YaXb mod p,現在 K 就是密鑰,接下來就可以用 K 作密鑰,用對稱加密演算法對用戶輸入進行加密了,然後將加密後的信息連同計算出來的 Yb 一同發送給伺服器端,伺服器端計算 K = YbXa mod p,這樣就可以得到跟客戶端相同的密鑰 K 了,最後用客戶端加密演算法的相應解密演算法,就可以在伺服器端將加密信息進行解密了,信息解密以後進行比較,一致則登錄成功,否則登錄失敗。需要注意的時候,這里伺服器端生成的隨機數 Xa 和 客戶端生成的隨機數 Xb 都不傳遞給對方。傳遞的數據只有 p、g、Ya、Yb 和加密後的數據。
但是如果我們不採用加密演算法而採用散列演算法對登錄密碼進行處理的話,可以避免被直接解密出原文,但是如果直接採用 MD5 或者 SHA1 來對登錄密碼進行處理後提交的話,一旦入侵者監聽到散列後的密碼,則不需要解密出原文,直接將監聽到的數據提交給伺服器,就可以實現入侵的目的了。而且,目前 MD5 演算法已被破解,SHA1 演算法則被證明從理論上可破解,就算採用離線碰撞,也可以找出與原密碼等價的密碼來。所以直接採用 MD5 或者 SHA1 來對密碼進行散列處理也是不可行的。
但是如果在散列演算法中加入了密鑰,情況就不一樣了。hmac 演算法正好作了這樣的事情,下面我們來看看如何用 hmac 演算法實現安全登錄。首先在客戶端向伺服器端請求登錄頁面時,伺服器端生成一個隨機字元串,連同登錄頁面一同發送給客戶端瀏覽器,當用戶輸入完用戶名密碼後,將密碼採用 MD5 或者 SHA1 來生成散列值作為密鑰,伺服器端發送來的隨機字元串作為消息數據,進行 hmac 運算。然後將結果提交給伺服器。之所以要對用戶輸入的密碼進行散列後再作為密鑰,而不是直接作為密鑰,是為了保證密鑰足夠長,而又不會太長。伺服器端接受到客戶端提交的數據後,將保存在伺服器端的隨機字元串和用戶密碼進行相同的運算,然後進行比較,如果結果一致,則認為登錄成功,否則登錄失敗。當然如果不用 hmac 演算法,直接將密碼和伺服器端生成的隨機數合並以後再做 MD5 或者 SHA1,應該也是可以的。
這里客戶端每次請求時伺服器端發送的隨機字元串都是不同的,因此即使入侵者監聽到了這個隨機字元串和加密後的提交的數據,它也無法再次提交相同的數據通過驗證。而且通過監聽到的數據也無法計算出密鑰,所以也就無法偽造登錄信息了。
對稱和非對稱加密演算法不僅適用於登錄驗證,還適合用於最初的密碼設置和以後密碼修改的過程中,而散列演算法僅適用於登錄驗證。但是散列演算法要比對稱和非對稱加密演算法效率高。
⑦ 如何在腳本裡面自動輸入密碼
shell腳本在處理自動循環或大的任務方面可節省大量的時間,通過創建一個處理任務的命令清單,使用變數、條件、算術和循環等方法快速創建腳本以完成相應工作,這比在命令行下一個個敲入命令要省時省力得多。
但是有時候我們可能會需要實現和交互程序如ftp,telnet伺服器等進行交互的功能,這時候我們需要用到shell的自動交互功能.
最簡單的例子就是創建用戶,我創建100個用戶,初始密碼為123,那麼要是挨著passwd username ,交互性輸入密碼,那不得瘋掉,但是腳本里應該怎麼寫呢?將密碼123,輸入到passwd命令?
本文收集了較常用交互方法,並進行了比較和總結。
自動交互方法一:利用命令的自帶參數,將標准輸入作為手動輸入的內容
自動交互最關鍵的就是交互信息的自動輸入,首先聯想到文件重定向,在shell編程中有這樣一種用法(參考Linux與UNIX SHELL編程指南 chapt 5.7):"command <<delimiter p="" 從標准輸入中讀入,直至遇到delimiter分界符。?
重定向操作符command <<delimiter是一種非常有用的命令,shell將分界符delimiter之後直至下一個同樣的分界符之前的所有內容都作為輸入,遇到下一個分界符, p="" shell就知道輸入結束了。最常見的delimiter分界符是eof,當然完全可以自定為其他字元。
對於需求1 要求的自動登陸ftp,並作系列操作,則可以用這種方法進行自動交互。代碼如下:
[yjwan@test ~]$ ftp -i -n 192.168.21.46 <
user dbftp dbftp101
ls
EOF
下面是得到的結果:
Connected to 192.168.21.46.
220 developerjail FTP server (Version 6.00LS) ready.
331 Password required for dbftp.
230 User dbftp logged in.
Remote system type is UNIX.
Using binary mode to transfer files.
229 Entering Extended Passive Mode (|||54281|)
150 Opening ASCII mode data connection for '/bin/ls'.
total 8847424
-rw-r--r-- 1 dbftp www 9055318991 Aug 28 14:28 ewiz90.sql_2010-08-29
226 Transfer complete.
221 Goodbye.
測試可以發現,如上代碼使用帳號名dbftp,密碼dbftp101成功登陸了ftp伺服器,並進入目錄,ls出當前目錄的文件。
注意事項:
1 這里一定要加-i ,否則必定失敗!!
這里ftp用的-I 參數 結束了互動式輸入,因此可以用文本的方式自動地輸入用戶密碼以及操作方式
如果不用-I 參數,那麼必定要求你手動輸入密碼的!!那麼就達不到自動登陸的要求了
你可以man ftp找到這個參數
-i 關閉多文件傳送中的互動式提示。請參考 prompt、mget、mput 和 mdelete 子命令,以取得多文件傳送中的提示的描述。
-n 防止在起始連接中的自動登錄。否則, ftp 命令會搜索 $HOME/.netrc 登錄項,該登錄項描述了遠程主機的登錄和初始化過程。請參考 user 子命令。
2 舉一反三:只要是要求輸入密碼的命令,一般都帶有一個參數,允許你從標准輸入,輸入用戶密碼,以及操作。
其他常用的自動登陸命令的參數
1) Passwd命令
Linux下 Passwd有參數
--stdin
This option is used to indicate that passwd should read the new password from standard input, which can be a pipe.
所以linux下自動改變用戶密碼的辦法就是
Echo 密碼 |passwd –stdin 用戶名
Freebsd沒有以上參數 注意
他的方法是echo passwd |pw mod user username -h 0
2)smbpasswd
-s
This option causes smbpasswd to be silent (i.e. not issue prompts)
and to read its old and new passwords from standard input, rather
than from /dev/tty (like the passwd(1) program does). This option
is to aid people writing scripts to drive smbpasswd
3)sudo
在shell腳本中需要用root用的來執行指令:
sudo 自動輸入密碼
echo "password" | sudo -S netstat -tlnp
-S
The -S (stdin) option causes sudo to read the password from the standard input instead of the terminal device.
3 標准輸入還可以用以下兩種寫法:
可以將下面的內容寫入到一個文本
然後ftp -I –n ip <文本
或者echo 「..」 |ftp –I –n ip
都是可以的!
因為他們都滿足「有一個標準的輸入」這個條件
4 ssh的自動登陸沒有這樣的自動輸入密碼的參數
一般都是使用公鑰/私鑰的方式自動登錄
這種文章滿街都是,網上google一下ssh自動登陸就可以找到答案。
或者用下面的辦法。
自動交互方法2:利用expect腳本自動登陸
這個 expect基本屬於一種編程了
基本任何需要互動式登陸的場合,他都可以解決,是相當的牛逼。
只要是第一種辦法解決不了的,基本都可以用這種辦法。
⑧ Linux系統如何利用shell交互實現關機操作
你指的是使用其它機器對某太機器實現遠程關機等操作嗎?開機我是不知道遠程怎麼做!
你可以這樣做:
ssh 192.168.1.100
輸入密碼
reboot / halt /
那麼可以編寫一個shell。可是你必須做密碼等價性才可以ssh不用密碼。
ssh等價:
ssh-keygen -t dsa
所有回車。
會在/root/.ssh下生成兩個文件,也就是公鑰和私鑰,你必須把公鑰復制到對方機器去。公鑰是有.pub結尾的。scp ******.pub 192.168.1.100:/root/.ssh/1.txt。
ssh 192.168.1.100
cat /root/.ssh/1.txt >> authorized_keys
ok搞定密碼等價。現在編寫腳本。
把ip添加道/root/tmp/ip.txt------------隨意放在哪裡。沒有固定
本機下腳本:
vim powf
#!/bin/sh
I=$( cat /root/tmp/ip.txt )
ssh "$I" <<EOF
read -p "please input option (r/h) " v_o
guanji $v_o
EOF
它機下腳本:
cd /usr/local/sbin
vim guanji
case $1 in
r) reboot ;;
h) halt ;;
*)
echo 'o no'
exit
esac
因為是放在通路上所以可以不寫絕對路徑。 你試試這個腳本,為臨時寫的,沒有測試過。呵呵
⑨ 如何遠程通過Xshell實現對linux主機的開、關機及重啟
關機的情況無法遠程開機,關機命令shutdown,重啟命令reboot,使用步驟如下:
1、連接上相應的linux主機,進入到等待輸入shell指令的linux命令行狀態下。