Linux上面執行 Windows 命令(比如 重啟服務)的簡單方法


1. 首先 基礎是:openssh 還有 expect的包

2. 方法

 安裝openssh

轉帖來自:

https://www.jianshu.com/p/6e5bc39d386e

 

最近項目在搞Jenkins持續集成,但是公司客戶生產環境服務器大部分是Windows Service,運維基本依靠遠程桌面。Linux系統流行的OpenSSH並不支持Windows,網上搜索Windows安裝OpenSSH大部分是比較老的教程,也試着裝過MobaSSH。這種ssh是基於cygwin的,ssh連接后依然使用的linux命令,而且文檔路徑寫法也不一樣容易出錯。。。

經過一番尋找,終於找到了微軟官方的解決方案:

基於PowerShell的OpenSSH:https://github.com/PowerShell/Win32-OpenSSH/releases

詳細說明可以參考Github的Wiki,這里簡單說下安裝步驟:

安裝步驟:

1、進入鏈接下載最新 OpenSSH-Win64.zip(64位系統),解壓至C:\Program Files\OpenSSH

2、打開cmd,cd進入C:\Program Files\OpenSSH(安裝目錄),執行命令:

powershell.exe -ExecutionPolicy Bypass -File install-sshd.ps1

3、設置服務自動啟動並啟動服務:

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


3. 安裝expect 方法
https://blog.csdn.net/robertsong2004/article/details/38983259

轉自

 

 

6個Expect腳本示例

本文譯至:http://www.thegeekstuff.com/2010/10/expect-examples/

Expect 腳本語言用於自動提交輸入到交互程序。它相比其它腳本語言簡單易學。使用expect腳本的系統管理員和開發人員可以輕松地自動化冗余任務。它的工作原理是等待特定字符串,並發送或響應相應的字符串。

以下三個expect命令用於任何自動化互動的過程。

  • send – 發送字符串到進程
  • expect – 等待來自進程的特定的字符串
  • spawn – 啟動命令 

請確保在您的系統上安裝expect軟件包,因為它不會被默認安裝。 一旦安裝后,你會看到expect解釋器“/usr/bin/expect”。 一般來說,expect腳本文件具有.exp的擴展。

 

1. Expect “Hello World”范例

下面的expect腳本等待具體字符串“hello”。 當它找到它時(在用戶輸入后),“world”字符串將作為應答發送。

#!/usr/bin/expect
expect "hello"
send "world"

2. 等待的字符串超時

默認情況下,等待的超時時間為10秒。 如果你不為expect命令輸入任何東西,將在20秒內超時。 您也可以更改超時時間,如下所示。

#!/usr/bin/expect
set timeout 10
expect "hello"
send "world"

3. 使用Expect自動化用戶進程

在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進程的作業,並生成預期的結果。

4. 在$expect_out變量中的匹配和不匹配的內容

在字符串匹配成功時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>

5. 自動化SU登錄到其他用戶帳戶 

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用戶帳戶。 

6. SSH登錄到另一台計算機

下面給出的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?!

 

 




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM