將expect和tcl的軟件包下載放到 /usr/local/src 目錄下,解壓tcl,進入tcl解壓目錄,而後進入unix目錄進行編譯安裝 [root@server-202 ~] # cd /usr/local/src/ [root@server-202 src] # tar -zvxf tcl8.4.11-src.tar.gz [root@server-202 src] # cd tcl8.4.11/unix [root@server-202 unix] # ./configure [root@server-202 unix] # make && make install 安裝expect [root@server-202 src] # tar -zvxf expect-5.43.0.tar.gz [root@server-202 src] # cd expect-5.43.0 [root@server-202 expect-5.43.0] # ./configure --with-tclinclude=/usr/local/src/tcl8.4.11/generic --with-tclconfig=/usr/local/lib/ [root@server-202 expect-5.43.0] # make && make install 安裝完成後進行測試 [root@server-202 ~] # expect expect1.1> [root@server-202 ~] # which expect /usr/local/bin/expect 作個expect執行文件的軟件 [root@server-202 ~] # ln -s /usr/local/bin/expect /usr/bin/expect [root@server-202 ~] # ll /usr/bin/expect 批量實現信任關係的腳本以下: [root@server-202 ~] # vim /opt/ssh_auth.sh #!/bin/sh DEST_USER=$1 PASSWORD=$2 HOSTS_FILE=$3 if [ $ # -ne 3 ]; then echo "Usage:" echo "$0 remoteUser remotePassword hostsFile" exit 1 fi SSH_DIR=~/. ssh SCRIPT_PREFIX=. /tmp echo =========================== # 1. prepare directory .ssh mkdir $SSH_DIR chmod 700 $SSH_DIR # 2. generat ssh key TMP_SCRIPT=$SCRIPT_PREFIX.sh echo "#!/usr/bin/expect" >$TMP_SCRIPT echo "spawn ssh-keygen -b 1024 -t rsa" >>$TMP_SCRIPT echo "expect *key*" >>$TMP_SCRIPT echo "send \r" >>$TMP_SCRIPT if [ -f $SSH_DIR /id_rsa ]; then echo "expect *verwrite*" >>$TMP_SCRIPT echo "send y\r" >>$TMP_SCRIPT fi echo "expect *passphrase*" >>$TMP_SCRIPT echo "send \r" >>$TMP_SCRIPT echo "expect *again:" >>$TMP_SCRIPT echo "send \r" >>$TMP_SCRIPT echo "interact" >>$TMP_SCRIPT chmod +x $TMP_SCRIPT /usr/bin/expect $TMP_SCRIPT rm $TMP_SCRIPT # 3. generat file authorized_keys cat $SSH_DIR /id_rsa .pub>>$SSH_DIR /authorized_keys # 4. chmod 600 for file authorized_keys chmod 600 $SSH_DIR /authorized_keys echo =========================== # 5. copy all files to other hosts for ip in $( cat $HOSTS_FILE) do if [ "x$ip" != "x" ]; then echo ------------------------- TMP_SCRIPT=${SCRIPT_PREFIX}.$ip.sh # check known_hosts val=` ssh -keygen -F $ip` if [ "x$val" == "x" ]; then echo "$ip not in $SSH_DIR/known_hosts, need to add" val=` ssh -keyscan $ip 2> /dev/null ` if [ "x$val" == "x" ]; then echo "ssh-keyscan $ip failed!" else echo $val>>$SSH_DIR /known_hosts fi fi echo "copy $SSH_DIR to $ip" echo "#!/usr/bin/expect" >$TMP_SCRIPT echo "spawn scp -r $SSH_DIR $DEST_USER@$ip:~/" >>$TMP_SCRIPT echo "expect *assword*" >>$TMP_SCRIPT echo "send $PASSWORD\r" >>$TMP_SCRIPT echo "interact" >>$TMP_SCRIPT chmod +x $TMP_SCRIPT #echo "/usr/bin/expect $TMP_SCRIPT" >$TMP_SCRIPT.do #sh $TMP_SCRIPT.do& /usr/bin/expect $TMP_SCRIPT rm $TMP_SCRIPT echo "copy done." fi done echo done . 在上面腳本文件的同目錄下新建名爲host的文件,將要創建 ssh 互信的機器名或ip地址添加到該文件中,每一個機器名或ip佔一行,如: [root@server-202 ~] # vim /opt/host 192.168.10.202 192.168.10.203 192.168.10.205 192.168.10.206 192.168.10.207 192.168.10.208 最後就能夠運行這個腳本ssh_auth.sh文件,ssh_auth.sh接受三個參數,遠程機器用戶名、密碼和host文件名(相對路徑或絕對路徑都可)。 [root@server-202 ~] # sh /opt/ssh_auth.sh root kevin123456 /opt/host 而後查看下其餘服務器,發現. ssh 目錄下的文件和192.168.10.202機器的. ssh 目錄下的文件一致。 最後就能夠在這些機器之間進行相互信任的 ssh 無密碼跳轉登陸了! ========================================================================== 注意:上面腳本針對的是服務器 ssh 端口是22的狀況,若是 ssh 是非22端口,好比是22222端口。 則只須要在ssh_auth.sh腳本中修改下面兩行內容: [root@server-202 ~] # cp /opt/ssh_auth.sh /opt/ssh_auth.sh.bak [root@server-202 ~] # vim /opt/ssh_auth.sh #注意下面一個小寫p,一個大寫P ....... val=` ssh -keyscan $ip 2> /dev/null ` 修改成 val=` ssh -keyscan -p 22222 $ip 2> /dev/null ` ....... echo "spawn scp -r $SSH_DIR $DEST_USER@$ip:~/" >>$TMP_SCRIPT 修改成 echo "spawn scp -P 22222 -r $SSH_DIR $DEST_USER@$ip:~/" >>$TMP_SCRIPT [root@server-202 ~] # diff /opt/ssh_auth.sh /opt/ssh_auth.sh.bak 57c57 < val=` ssh -keyscan -p 22222 $ip 2> /dev/null ` --- > val=` ssh -keyscan $ip 2> /dev/null ` 67c67 < echo "spawn scp -P 22222 -r $SSH_DIR $DEST_USER@$ip:~/" >>$TMP_SCRIPT --- > echo "spawn scp -r $SSH_DIR $DEST_USER@$ip:~/" >>$TMP_SCRIPT 最後執行腳本,進行相互信任關係批量部署便可 [root@server-202 ~] # sh /opt/ssh_auth.sh root kevin123456 /opt/host |