1. 程式人生 > >通過SHELL實現SSH的無密登入

通過SHELL實現SSH的無密登入

ssh連線遠端主機時候詢問密碼,跟su、sudo命令的預設行為一樣,是不從stdin讀入資料的,據稱是為安全考慮,但是有時候在腳本當中確實需要無人守值的登陸。

搜尋一下不難找到類似的例子,使用expect來完成密碼應答:

#!/bin/bash
auto_login_ssh () {
    expect -c "set timeout -1;
                spawn -noecho ssh -o StrictHostKeyChecking=no $2 ${@:3};
                expect *assword:*;
                send -- $1\r;
                interact;";
}

auto_login_ssh passwd 
[email protected]

StrictHostKeyChecking=no引數讓ssh預設新增新主機的公鑰指紋,也就不會出現出現是否繼續yes/no的提示了。

expect很不錯,上述程式碼基本可以達到要求了,能夠當翻牆用的ssh -D自動登陸,執行遠端命令等等,但是如果作為一個完全非互動的遠端工具,應該說還一差,不能返回整個連線執行過程是否成功。

使用expect後,程式的exit status是expect的,而不是ssh的,所以如果遇上連線不到的主機、密碼錯誤等情況,expect也一樣是正常退出,$?為0,所以需要對expect的程式碼稍加修改;

#!/bin/bash
auto_smart_ssh () {
    expect -c "set timeout -1;
                spawn ssh -o StrictHostKeyChecking=no $2 ${@:3};
                expect {
                    *assword:* {send -- $1\r;
                                 expect {
                                    *denied* {exit 2;}
                                    eof
                                 }
                    }
                    eof         {exit 1;}
                }
                "
    return $?
}

auto_smart_ssh passwd 
[email protected]
ls /var echo -e "\n---Exit Status: $?"

這段expect的Tcl程式碼主要作用是,如果在輸入密碼後遇到Permission denied,肯定是指令碼提供的帳號有問題,就直接讓expect按狀態2退出;而如果主機不可達No route to host, timed out, Connection refused等情況,ssh會直接退出,expect收到eof,讓其按狀態1退出。而因為這個設計本來就用於執行遠端命令後退出,不需要使用者互動,所以第9行的eof則是讓expect等待ssh退出,而不是不是進行interact了。

有這樣的處理,使用autosmartssh的指令碼就可以根據返回值判斷執行過程的是否成功,而進行相應處理了。

openssh裡面另外一個很好用的遠端檔案傳輸工具scp,也以如法炮製:

auto_scp () {
    expect -c "set timeout -1;
                spawn scp -o StrictHostKeyChecking=no ${@:2};
                expect {
                    *assword:* {send -- $1\r;
                                 expect {
                                    *denied* {exit 1;}
                                    eof
                                 }
                    }
                    eof         {exit 1;}
                }
                "
    return $?
}

auto_scp pass ~/myfile [email protected]:~/path/to/myfile
echo $?

後話:
如果僅僅是日常使用,為了避免經常輸入主機密碼的麻煩,最理想的方法是生產本機的公/私金鑰對,把指紋直接複製到遠端主機上,較新的openssh提供了ssh-copy-id工具:
ssh-keygen
ssh-copy-id [email protected]
ssh-copy-id [email protected]
ssh-copy-id [email protected]

執行ssh-keygen時會問幾個問題,全部回車預設就是我們要的效果了,分別把金鑰分發到遠端主機後,以後執行ssh [email protected],還是scp,都是直接完成了。

如果需要刪除遠端機器上對應本機本賬戶的金鑰,登陸到該賬戶,開啟~/.ssh/authorized_keys檔案,搜尋你的使用者名稱,刪除那行,儲存,即可。

當然也可以自動化:

auto_ssh_copy_id () {
    expect -c "set timeout -1;
                spawn ssh-copy-id $2;
                expect {
                    *(yes/no)* {send -- yes\r;exp_continue;}
                    *assword:* {send -- $1\r;exp_continue;}
                    eof        {exit 0;}
                }";
}

另外,還有4中常用的命令方式實現免輸入密碼登入:
1. 自動ssh/scp方法
A為本地主機(即用於控制其他主機的機器) ;
B為遠端主機(即被控制的機器Server), 假如ip為192.168.60.110;
A和B的系統都是Linux
在A上執行命令:
# ssh-keygen -t rsa (連續三次回車,即在本地生成了公鑰和私鑰,不設定密碼)
# ssh [email protected] “mkdir .ssh” (需要輸入密碼)
# scp ~/.ssh/id_rsa.pub [email protected]:.ssh/id_rsa.pub (需要輸入密碼)
在B上的命令:
# touch /root/.ssh/authorized_keys (如果已經存在這個檔案, 跳過這條)
# cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys (將id_rsa.pub的內容追加到authorized_keys 中)
回到A機器:
# ssh [email protected] (不需要密碼, 登入成功)
2. 控制n個機器如上所述自動登入
那就需要n對鑰匙(金鑰和公鑰), ssh-keygen 命令可以隨意更改鑰匙對的名字, 比如:
# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): /root/.ssh/id_rsa_192.168.60.110
這樣私鑰和公鑰的名字分別就是: id_rsa_192.168.60.110和 id_rsa_192.168.60.110.pub;然後將 id_rsa_192.168.60.110.pub 檔案的內容, 追加到sever的 ~/.ssh/authorized_keys檔案中,最後, 在本地用ssh命令的 -i 引數指定本地金鑰, 並登入:
# ssh -i /root/.ssh/id_rsa_192.168.60.110 [email protected]
scp也是一樣的
# scp -i /root/.ssh/id_rsa_192.168.60.110 filename [email protected]:/home/someone
在檔案.bashrc中加下兩行,每次做同樣的操作就不用敲入這樣長的命令了:
alias sshcell=’ssh -i /root/.ssh/id_rsa_192.168.60.110 [email protected]
alias scpcell=’scp -i /root/.ssh/id_rsa_192.168.60.110 filename [email protected]:/home/someone’
這樣,直接鍵入一下指令實現ssh和scp自動登入:
# sshcell
# scpcell
3. 自動ssh/scp指令碼
如果需要從A,到B,然後才能夠到C,那麼需要ssh和scp兩次,是比較麻煩的。
ssh自動登入:
#!/usr/bin/expect -f
set timeout 30
spawn ssh [email protected]
expect “password:”
send “ppppppr”
expect “]*”
send “ssh [email protected]
expect “password:”
send “ppppppr”
interact
scp從A拷貝檔案到C:
#!/usr/bin/expect -f
set timeout 300
set file [lindex argv0]spawnscpfile [email protected]:/home/weiqiong
expect “password:”
send “ppppppr”
expect “]*”
spawn ssh [email protected]
expect “password:”
send “ppppppr”
expect “]*”
send “scp file w[email protected]:/home/weiqiongr”  
    expect “password:”  
    send “ppppppr”  
    expect “]*”  
    exit  
    interact  
scp從C拷貝檔案到A:  
    #!/usr/bin/expect -f  
    set timeout 300  
    set file [lindex
argv 0]
spawn ssh [email protected]
expect “password:”
send “ppppppr”
expect “]*”
send “scp [email protected]:/home/weiqiong/file.rexpectpassword:sendpppppprexpect]sendexitrexpect]spawnscpweiqiong@B:/home/weiqiong/file .
expect “password:”
send “ppppppr”
interact
4. 建立ssh/scp通道
比如說我的機器是A,中間伺服器為B,目標伺服器是C
從A可以ssh到B,從B可以ssh到C,但是A不能直接ssh到C
現在展示利用ssh通道技術從A直接傳輸檔案到C
1. ssh -L1234:C:22 [email protected]
input B’s password
(1234是本機A的空閒埠,該指令需要A機器上的root使用者許可權,實際上是在本機1234埠建立了一個通道)
2. 開啟一個新的console,鍵入:
scp -P1234 filename [email protected]:
input C’s password

相關推薦

通過SHELL實現SSH登入

ssh連線遠端主機時候詢問密碼,跟su、sudo命令的預設行為一樣,是不從stdin讀入資料的,據稱是為安全考慮,但是有時候在腳本當中確實需要無人守值的登陸。 搜尋一下不難找到類似的例子,使用expect來完成密碼應答: #!/bin/bash auto_l

ssh登入配置詳解(hadoop叢集搭建)

ssh無密登入原理 注:私鑰和公鑰是每個使用者獨有的,而不是機器或者伺服器的,比如一臺電腦或者伺服器或者虛擬機器,可以同時存在多個使用者,但不同使用者需要遠端登入其他伺服器或者虛擬機器時,都必須配置各自的私鑰和公鑰,而且使用者之間的各不相同 常用命令 ssh ip(遠端登入也可

Hadoop叢集SSH登入

Hadoop叢集SSH無密登入 1.原理及操作 1.1在登入使用者家目錄的.ssh下操作 1.2生成公鑰和私鑰 1.3將公鑰拷貝到要免密登入的目標機器上 2.無密配置(注意命令執行位置!) 2.1在配置Nam

expect一鍵實現集群ssh登入

scriptexpect具有非交互式功能yum -y install expectmkpasswd -l 20 #<==生成隨機字符串,-l參數指定生成字符串的長度非交互密鑰分發添加用戶(所有機器)useradd jiege1echo 123456|passwd --stdin jiege1id j

Shell腳本實現ssh登錄及批量配置管理

ssh免密登錄 批量部署管理 shell一鍵實現腳本 本節索引場景分析ssh免密登錄pssh工具批量管理SHELL自動化腳本本篇總結場景分析作為一個運維工程師,不是每個人工作的環境都想阿裏、騰訊那樣,動不動就上億的PV量,上萬臺服務器。我們通常還是工作在,幾十臺上百臺服務器這樣的環境,而使用ans

linux雙機ssh登入實現

環境:       虛擬機器:virtualBox       linux系統:CentOS 7       目標主機:A機、B機   操作:(以下順序執行)  

Linux 通過rsa公鑰實現ssh免密碼登入

1、ssh免密碼登入root登入192.168.121.212,然後以tomcat帳號ssh遠端登入10.14.13.16上,不需要輸入密碼,需要達到如下效果:[[email protected] .ssh]# ssh [email protected]

shell實現SSH自動登陸

完成 一個 test target 需要 ring blank 繼續 創建 前言 公司開發使用docker,每次登陸自己開發機總要輸入 ssh [email protected]/* */_string,然後再確認輸入password,手快了還經常會輸錯。作為一

Centos7實現ssh登陸

manage oca sent centos7 main with false SQ present 1通過ssh-copy-id的方式 1 [root@localhost ~]# ssh-copy-id -i root@worker1 2 /usr/bin/ssh-

linux下實現ssh登錄

復制 由於 linu width tro watermark linux roc 密碼登錄 設置ssh無密碼登錄可以提高我們主機的安全性。ssh 無密碼登錄要使用公鑰與私鑰。linux下可以用ssh-keygen生成公鑰/私鑰對,接下來以Centos為例。例圖:實驗主機A無

linux設定ssh登入ssh-copy-id命令

linux系統配置免密碼的方式: 1:ssh-keygen -t rsa ssh-keygen -t dsa 生成金鑰 2:ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected] # 接下來一路回車到底

配置Linux ssh登入

linux 常用的ssh登入方式主要有兩種:密碼登入和證書登入 有兩臺機器,機器A和機器B: 如從A登入機器B: 密碼登入方式:在機器A上操作 ssh [email protected]機器B的ip 提示輸入密碼,登入成功! 免密登入方式:在機器A上操作 ssh [em

SSH登入配置和遠端登入伺服器

生成SSH私鑰和公鑰 ssh-keygen -t rsa 手動建立一個 authorized_keys檔案 touch ~/.ssh/authorized_keys 公鑰檔案內容複製到authorized_keys檔案裡面 cat ~/.ssh/id_rsa.pub

自動設定ssh登入指令碼

自動設定ssh免密登入指令碼 `#!/bin/bash #yum安裝expect yum -y install expect #PWD_1是登陸密碼,可以自己設定 PWD_1=123456 ips=$(cat /etc/hosts |grep -v “::” | grep -v “127

配置ssh登入伺服器

當前伺服器環境為ubantu 14.04 一、本地 ①生成id_rsa   id_rsa.pub ssh-keygen -t rsa -C "[email protected]" ssh -T [email protected] 碼雲生成ssh ke

非對稱加密演算法:實現ssh免密碼登入

**描述:利用非對稱加密演算法,實現兩臺主機之間可以免密碼直接登入 ,如下圖:** 整個實驗的原理如下圖: 具體步驟如下: 1、先準備好實驗需要的環境(兩臺虛擬機器–A:192.168.72.73,B:192.168.72.23),此時,我們遠端登入主機B,

Linux的SSH登入認證過程研究

一、先看下SSH免密登入使用到的工具和生成的檔案 工具:ssh-keygen用於生成祕鑰檔案,其中祕鑰分為公鑰和私鑰、ssh-copy-id用於複製公鑰檔案到被控制機。 檔案:ssh-keygen生成的祕鑰檔案有兩個,放在~/.ssh/,id_rsa為私鑰、id_rsa.pub為公鑰 被控制機檔案:通過

關於Hadoop叢集中使用SSH登入的詳細操作!

很多時候,在我們操作不同的虛擬機器時,常常因為一些需要密碼的操作,因此,各虛擬機器之間的免密設定必不可少。那麼這篇我們就來介紹關於虛擬機器之間配置SSH免密操作的詳細流程! 準備條件:兩臺以上的虛擬機器,因為想要給大家介紹關於Hadoop叢集的搭建,所以我這邊準備了三臺虛擬機器,分別為: h

牛逼的SSH登入-低調小熊貓的技術小黑屋

牛逼的SSH免密登入 相逢便是緣,歡迎來到低調小熊貓的技術小黑屋我的部落格:https://aodeng.cc 我的公眾號:低調小熊貓 我的QQ群:756796932 1.生成SSH金鑰和公鑰 ssh-keygen -t rsa 會在當前目錄生成名為id_rsa的私鑰

linux ssh登入/scp命令

● 生成本機的密碼(私鑰和公鑰) #一直回車下去即可(敲三下) [[email protected] ~]# ssh-key ssh-keygen ssh-keyscan [[email protected] ~]# ssh-keygen Generatin