Windows SSH配置及免密執行命令指南

Windows端SSH服務設置,OpenSSH配置

場景:首先解釋一下爲什麼手動安裝OpenSSH,因爲是公司內網中的內網,無法訪問微軟商店。

SSH是什麼

SSH原理及基本使用

下載OpenSSH-Win64.zip,是免安裝的,建議解壓到C:\Program Files,將C:\Program Files\OpenSSH64 添加至環境變量使得cmd或powerShell認識,做SSH服務啓動及開機自啓動設置,這部分具體步驟推薦參考, 但該博客配置免密登錄寫的不好不要看了。或MS官方powerShell配置方式

爲OpenSSH指定默認powerShell, 參考MS官方

New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -PropertyType String -Force

ssh_config相關奇葩問題

聽聞還有遇到ssh_config/sshd_config配置文件問題的,我這次運氣比較好,先是試着用FreeSSH失敗後,轉用OpenSSH但FreeSSH服務還在,徹底卸載乾淨後重啓,還好沒再出幺蛾子,ssh_config/sshd_config參數中文詳解

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-h1kxa97M-1588823877868)(C:\Users\w00448203\AppData\Roaming\Typora\typora-user-images\1588771206504.png)]

出現如下提示是SSH server配置發生過改變,在客戶端中ssh目錄known_hosts中存儲的sshServer信息不對,需要更新下,嗯直接刪除該文件中對應server的信息即可。

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-oTTjU0vu-1588823877870)(C:\Users\w00448203\AppData\Roaming\Typora\typora-user-images\1588771420575.png)][外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-XPxOwlut-1588823877872)(C:\Users\w00448203\AppData\Roaming\Typora\typora-user-images\1588771490460.png)]

client第一次連接sshServer會出現下述提示,

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-pXxV7Ox2-1588823877874)(C:\Users\w00448203\AppData\Roaming\Typora\typora-user-images\1588771121632.png)]

好了,至此ssh連接OK了。接下來做SSH免密登錄,用來跨機器執行任務

SSH免密登錄

注意: Windows做SSHserver, 配置client端SSH免密登錄

免密的祕鑰對詳解

SSH連接,要求client端ssh下known_hosts存儲server信息,在第一次ssh連接時生成;免密只需再將client端的id_rsa.pub 註冊給server的authorized_keys

操作步驟

  • 先ssh user@host 手動登錄OK下

  • client端 ssh-keygen -t rsa 生成祕鑰對.ssh目錄id_rsa.pub, id_rsa

  • 將client端的公鑰id_rsa.pub內容append到Server端的authorized_keys,沒有就新建個該文件 可用ssh-copy-id user@server

  • 用ssh-copy-id命令我沒成功,直接拷貝pub到authorized_keys就OK了

WindowsServer遠程SSH執行命令

dos之start講解(及更多dos指令)

dos之taskkill指令

SSH免密登錄並執行dos指令。只有taskCmd1會阻塞,一直刷屏,導致下面的sleep,taskKill指令無法執行。無法達到預期效果,這時怎麼搞呢?

思路1:寫成python腳本。ssh username@server python xx.py的方式,但python2.7遇到問題os.popen() , os.system() 並不會創建新shell進程來執行,也一樣會阻塞。如果os庫下有創建新shell去執行就好了。 查了下沒有。反正windows下不會創建新shell去執行。這樣python上只能使用thread模塊,不想搞那麼複雜。

update:os.system() 是創建新shell進程去執行cmd的,可行。具體實現

# coding=utf-8

import os
import time
 
path1 = os.path.dirname(__file__)
print(path1)#獲取當前運行腳本的絕對路徑

print'Begin iperf'
iperfCmd = 'start /b iperf -c 8.8.8.8 -u -b 150M -t 999 -i 1'
os.system(iperfCmd)

killIperf = 'taskkill /F /im iperf.exe'
print 'sleep begin'
time.sleep(10)
print 'sleep end'
os.system(killIperf)
print 'killed iperf'

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-xYyCwhFZ-1588823877875)(C:\Users\w00448203\AppData\Roaming\Typora\typora-user-images\1588818897236.png)]

思路2:繼續使用batch腳本,但像Linux上的nohup & 那樣讓後臺執行,不會阻塞下面命令執行。然後powerShell,cmd都沒有,不支持。cmd下有一個start /b command 可以後臺,但只cmd支持,powerShell並不支持,然後需要sleep N秒,這sleep指令又只有powerShell支持而cmd不支持。而dos命令也沒有開啓新窗口的指令。無奈啊無奈。

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-VBzrLOhD-1588823877876)(C:\Users\w00448203\AppData\Roaming\Typora\typora-user-images\1588767680319.png)]

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-jE8XJxpy-1588823877877)(C:\Users\w00448203\AppData\Roaming\Typora\typora-user-images\1588767719656.png)]

dos上powerShell與cmd支持的指令差別很大,這個真的很傷。

思路3:我tm要用的iperf這麼強大的通用命令,心想或許有指定時長的參數。臥槽一看

iperf -c 8.8.8.8 -u -b 150M -t 40 -i 1

這tm -t 就是呀。哎一條指令可以搞定了。自動退出不香麼

思路4: 安裝了git 自然擁有強大的bash ,試試這能否達到預期,還真是可以的。nohup & , sleep, ps , grep , kill命令通通支持。當然win指定gitbash需要註冊表修改下。直接在cmd,powerShell中無法直接切換

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-FrmAdVm1-1588823877877)(C:\Users\w00448203\AppData\Roaming\Typora\typora-user-images\1588768578859.png)]

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-aCJALKuL-1588823877878)(C:\Users\w00448203\AppData\Roaming\Typora\typora-user-images\1588768734116.png)]

這裏的小技巧:阻塞命令放後臺執行,不斷刷屏的,可以 > 輸出重定向

至此踩了一天的坑,總算打通了Linux SSH訪問Windows執行指令。學了不少腳本開發知識。

SSH遠程執行命令/任務

基本方式:

ssh user@host  "cmd1; cmd2; cmd3"

ssh user@host < python iperf.py  # 執行遠程服務器上的py腳本

ssh user@host < task.sh args  # 執行本地腳本,可帶參數arg

ssh user@host < "/tmp/test.sh args"  # 執行遠程服務器上的腳本並帶參數
ssh user@remote.host nohup python scriptname.py &  #nohup& 僅限Linux

更多參考

Linux一鍵清空文件內容

快速清空一個文件或者log的內容

1、#echo "" > test.txt(文件大小被截爲1字節)

2、# > test.txt(文件大小被截爲0字節)

3、#cat/dev/null > test.txt(文件大小被截爲0字節)

7943/article/details/81535825):

1、#echo "" > test.txt(文件大小被截爲1字節)

2、# > test.txt(文件大小被截爲0字節)

3、#cat/dev/null > test.txt(文件大小被截爲0字節)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章