1. 首先 基礎是:openssh 還有 expect的包html
2. 方法linux
安裝opensshgit
轉帖來自:github
https://www.jianshu.com/p/6e5bc39d386e
最近項目在搞Jenkins持續集成,可是公司客戶生產環境服務器大部分是Windows Service,運維基本依靠遠程桌面。Linux系統流行的OpenSSH並不支持Windows,網上搜索Windows安裝OpenSSH大部分是比較老的教程,也試着裝過MobaSSH。這種ssh是基於cygwin的,ssh鏈接後依然使用的linux命令,並且文檔路徑寫法也不同容易出錯。。。shell
通過一番尋找,終於找到了微軟官方的解決方案:服務器
基於PowerShell的OpenSSH:https://github.com/PowerShell/Win32-OpenSSH/releases併發
詳細說明能夠參考Github的Wiki,這裏簡單說下安裝步驟:運維
一、進入連接下載最新 OpenSSH-Win64.zip(64位系統),解壓至C:\Program Files\OpenSSHssh
二、打開cmd,cd進入C:\Program Files\OpenSSH(安裝目錄),執行命令:工具
powershell.exe -ExecutionPolicy Bypass -File install-sshd.ps1
三、設置服務自動啓動並啓動服務:
sc config sshd start= auto
net start sshd
到此服務已經安裝完畢,默認端口同樣是22,默認用戶名密碼爲Window帳戶名和密碼,固然防火牆仍是要設置對應端口容許通信
一般linux下會修改ssh_config文件來修改ssh配置,但在安裝目錄並無發現這個文件,查閱官方wiki後發現,原來是在C:\ProgramData\ssh目錄下(此目錄爲隱藏目錄)
端口號:Port 22
密鑰訪問:PubkeyAuthentication yes
密碼訪問:PasswordAuthentication no
空密碼:PermitEmptyPasswords no
而後進入C:\Users\帳戶名\.ssh目錄,建立authorized_keys公鑰文件(也可在ssh_config修改路徑)(僅限7.7以前版本,7.9版本請看最後更新)
設置完成後重啓sshd服務,接下來就可使用Xshell等工具使用密鑰鏈接了~
踩過的坑:
命令行不識別空格時:C:\Program Files\用C:\Progra~1\替代
Windows Service2012R2即便配置了.ssh/authorized_keys公鑰,鏈接時依然顯示沒有註冊公鑰。。。
查閱了官方wiki判斷多是權限問題:Fix SSH file permissions
進入C:\Program Files\OpenSSH(安裝目錄),右鍵 FixHostFilePermissions.ps1【使用PowerShell運行】,命令行提示全選是,重啓sshd服務後密鑰鏈接正常
2019.5.17更新:
新部署服務器的時候,發現公鑰沒法註冊,發現新版本有變更:
參考官方wiki:administrators_authorized_keys
Administrators用戶組的用戶鏈接公鑰,默認位置爲
C:\ProgramData\ssh\administrators_authorized_keys
而且須要設置權限,在CMD中執行命令:
icacls administrators_authorized_keys /inheritance:r
icacls administrators_authorized_keys /grant SYSTEM:(F)
icacls administrators_authorized_keys /grant BUILTIN\Administrators:(F)
修改ssh_config文件:
AuthorizedKeysFile %programdata%/ssh/administrators_authorized_keys
重啓sshd服務,便可使用密鑰登錄SSH
https://blog.csdn.net/robertsong2004/article/details/38983259 轉自
本文譯至:http://www.thegeekstuff.com/2010/10/expect-examples/
Expect 腳本語言用於自動提交輸入到交互程序。它相比其它腳本語言簡單易學。使用expect腳本的系統管理員和開發人員能夠輕鬆地自動化冗餘任務。它的工做原理是等待特定字符串,併發送或響應相應的字符串。
如下三個expect命令用於任何自動化互動的過程。
下面的expect腳本等待具體字符串「hello」。 當它找到它時(在用戶輸入後),「world」字符串將做爲應答發送。
#!/usr/bin/expect expect "hello" send "world"
默認狀況下,等待的超時時間爲10秒。 若是你不爲expect命令輸入任何東西,將在20秒內超時。 您也能夠更改超時時間,以下所示。
#!/usr/bin/expect set timeout 10 expect "hello" send "world"
在Expect的幫助下,你能夠自動化用戶進程,並獲得指望的輸出。 例如,您可使用Expect編寫測試腳原本簡化項目的測試用例。
下面的例子執行了額外的程序自動化。
#!/usr/bin/expect set timeout 20 spawn "./addition.pl" expect "Enter the number1 :" { send "12\r" } expect "Enter the number2 :" { send "23\r" } interact
執行上面的腳本,輸出結果以下所示。
$ ./user_proc.exp spawn ./addition.pl Enter the number1 : 12 Enter the number2 : 23 Result : 35
若是你寫的代碼沒有interact命令,在這種狀況下,腳本會在發送字符串「23\r」後當即退出。 interact命令執行控制,處理addtion進程的做業,並生成預期的結果。
在字符串匹配成功時expect返回,但在此以前它將匹配的字符串存儲在$expect_out(0,string)。以前所收到的字符串加上匹配的字符串存儲在$expect_out(buffer)。下面的例子展現了這兩個變量匹配的值。
#!/usr/bin/expect set timeout 20 spawn "./hello.pl" expect "hello" send "no match : <$expect_out(buffer)> \n" send "match : <$expect_out(0,string)>\n" interact
hello.pl程序只是打印兩行,以下圖所示。
#!/usr/bin/perl print "Perl program\n"; print "hello world\n";
以下所示執行。
$ ./match.exp spawn ./hello.pl Perl program hello world no match : <Perl program hello> match : <hello>
Expect可讓你從程序中傳遞密碼給Linux登陸帳號,而不是在終端輸入密碼。在下面的程序中,su自動登陸到須要的帳戶上。
#!/usr/bin/expect set timeout 20 set user [lindex $argv 0] set password [lindex $argv 1] spawn su $user expect "Password:" send "$password\r"; interact
以下所示執行上面的expect程序。
bala@localhost $ ./su.exp guest guest spawn su guest Password: guest@localhost $
運行上面的腳本後,從bala用戶賬戶登陸到guest用戶賬戶。
下面給出的expect程序項目可自動從一臺計算機ssh登陸到另外一臺機器。
#!/usr/bin/expect set timeout 20 set ip [lindex $argv 0] set user [lindex $argv 1] set password [lindex $argv 2] spawn ssh "$user\@$ip" expect "Password:" send "$password\r"; interact
執行上面的expect程序以下所示。
guest@host1 $ ./ssh.exp 192.168.1.2 root password spawn ssh root@192.168.1.2 Password: Last login: Sat Oct 9 04:11:35 2010 from host1.geetkstuff.com root@host2 #
4. 我這邊的簡單命令爲
腳本爲:
#!/usr/bin/expect set timeout 20 set ip [lindex $argv 0] set user [lindex $argv 1] set password [lindex $argv 2] spawn ssh "$user\@$ip" "net start gscloud" expect "password:" send "$password\r"; interact
執行的命令爲:
./deploy/startwin 10.24.196.213 administrator Test1127?!