在win中,給powershell客戶端,搭建sshd服務器。


下載
https://github.com/PowerShell/Win32-OpenSSH/releases
 
 

問:為什么要用這個sshd?
答:
這是微軟用,openssh官方的源碼,
源碼網址:
https://github.com/PowerShell/openssh-portable
被微軟編譯后的2進制程序。2進制程序上,有微軟的簽名。
win下,免費的sshd,是不是微軟這個版本最新?並且開放源碼?
不建議使用其他公司的閉源sshd,里面可能有后門。
而且收費的sshd,雖然軟件比較新,但一般都是閉源的。
不建議使用,n年前的低版本sshd,軟件太老有漏洞。
 
 
 
解壓:可以解壓到任意目錄。
建議解壓到:
d:\OpenSSH_Win64_7.9p1
不建議安裝在c盤。
 
 
 
安裝
powershell.exe -ExecutionPolicy Bypass -File install-sshd.ps1
 
服務名為:
sshd

顯示服務名為:
OpenSSH SSH Server
powershell 傳教士 原創文章 ,2019-04-23
 
 

sshd_config配置文件存儲目錄為
$env:ProgramData\ssh\

C:\ProgramData\ssh\
 
 
目的:
生成sshd_config等文件
動作:
啟動並停止服務:
Set-Service -Name sshd -StartupType 'Automatic'
start-service sshd
stop-service sshd
 
管理員權限的powershell, 更換sshd服務器的,主機秘鑰
Remove-Item -path C:\ProgramData\ssh\ssh_host_*
cd d:\你的安裝目錄
ssh-keygen -A
注意:更換主機秘鑰后,客戶機需要刪除,用戶的known_host文件,如: /root/.ssh/known_hosts
 
 
問:如何更改sshd_config?
答:
這個文件存儲在c盤,修改后保存不了。所以你應該
復制C:\ProgramData\ssh\sshd_config到d盤。
用記事本打開並更改,保存。
再復制回來。
這時文件權限壞了,但並不影響sshd服務啟動。
 

問:ssh客戶端公鑰,添加到哪里?
答:
此版本的ssh客戶端公鑰,應該添加到這個文件中:
C:\ProgramData\ssh\administrators_authorized_keys
 

用管理員權限的powershell,開啟防火牆22端口
New-NetFirewallRule -Name sshd -DisplayName 'OpenSSH Server (sshd)' -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 22
 
 
 
用管理員權限的powershell ,讓powershell成為默認shell
New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -PropertyType String -Force
 
 
用管理員權限的powershell, 讓powershell把遠程發送來的字符串,識別為命令,而不是腳本名
New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShellCommandOption -Value "/c" -PropertyType String -Force
 
 
 
目的: 讓(win,linux)ssh服務器,接收來自客戶機【powershell的連接】
管理員權限運行powershell后,運行命令:
win,linux,客戶機中的powershell--->ssh--->win服務器上的的sshd:

1下載
https://github.com/PowerShell/PowerShell/releases
 
 
2安裝必須安裝powershell6。powershell5.1不行。
如PowerShell-6.2.0-win-x64.msi
 
 
3目的:由於sshd不支持帶空格的路徑,所以要給它 建立一個鏈接目錄
New-Item c:\pwsh -ItemType SymbolicLink -Target 'C:\Program Files\PowerShell\6'
 

4目的:在sshd_config的非最后面行中, 寫入subsystem在sshd_config文件最后面寫入subsystem,則sshd啟動不了。opensshd真是奇葩啊!
 
用管理員權限的powershell,在win服務器上的sshd上運行:
$f = "$env:ProgramData\ssh\sshd_config"
$f2 = Get-Content -LiteralPath $f
Set-Content -LiteralPath $f -Value $f2[0..7]
Add-Content -LiteralPath $f -Value 'Subsystem powershell c:\pwsh\pwsh.exe -sshs -NoLogo -NoProfile' 
Add-Content -LiteralPath $f -Value $f2[8..$f2.length]

 


win,linux,客戶機中的powershell--->ssh---> linux服務器上的的sshd
pwsh -c 'Add-Content  -Value "`nSubsystem powershell /usr/bin/pwsh -sshs -NoLogo -NoProfile" -LiteralPath /etc/ssh/sshd_config '

重新啟動win上的sshd服務
restart-service sshd

問:從linux經ssh連接到win上的sshd,為什么要用powershell?而不是bash?
問:powershell經過ssh,遠程運行命令,比bash強在哪?

答:
=============linux遠程命令 & ps遠程命令 對比例子============
任意sh ---> ssh ---> linux上的bash:
ssh aaa@1.1.1.1 "以用戶aaa權限執行的,命令xxx"
 
win,linux中的powershell ---> ssh ---> linux上的powershell:
$a = 1
[scriptblock]$備份命令 = 
{
 Get-Date
 $b = $using:a + 2 #引用客戶機變量,需要用$using:
}
$連接1 = New-PSSession -HostName 1.1.1.1 -UserName root  #手動輸入密碼或用-KeyFilePath 選項。還需要修改/etc/ssh/sshd_config
invoke-command -ScriptBlock { $備份命令 } -Session $連接1

 

============================================================
bash的遠程命令,簡單直接。就好像我左手這盤蛋炒飯,簡單解餓,但是不夠強。更適用於 簡單遠程命令場合。
你再看看我右手這盤蓋飯好在哪?答:生菜墊底,蘿卜雕花圍邊。
bash遠程傳遞的是【字符串】,powershell傳遞的是【代碼塊】。特色是【對象墊底,大花括號圍邊】。
字符串傳遞到遠程時,經常需要要轉義。代碼塊不用。
代碼塊,支持多行,格式化,使代碼美觀。
變量名,函數名支持中文。
代碼塊中,支持引用客戶端變量,一律加上【$using:】,即客戶機上的【$a】,在服務器上叫【$using:a】
代碼塊中,支持引用服務器端變量,即服務器上的【$a】,在服務器還上叫【$a】
即使變量重名,兩個$a也絕不會弄混。
強類型變量,在遠程使用,無需序列化/反序列化。這點py不行。java不行。
ps用大花括號包圍代碼,不用單雙引號,代碼嵌套很容易。
而代碼嵌套容易,使的ps的ssh遠程,從server1(跳板機,堡壘機)經ssh進入server2,再ssh進入server3,進入33層ssh server執行命令很容易。而shell難。
遠程代碼天生不老穩定的,有時沒反應,或卡住,或中途斷了。遇到此情形,每行ps代碼都可以在外面套上try-cacth,比shell更穩。
批量ssh,ps采用【多線程】,比bash用【多進程】快,時間准,省內存。
 

----------【測試】----------
先在win中的d盤,建立幾個中文文件名。
從終端軟件xshell中,連接:
win用戶名
win密碼
終端軟件的編碼,選unicode(utf-8),這點和連接linux相同。
 

從終端軟件xshell中,發送測試命令:
$PSVersionTable
get-childitem d:\
dir 查看中文會不會亂碼。
 
至此,win服務器安裝完畢。
 
從客戶機的powershell中,發送測試命令:
$服務器ip = '192.168.1.201'
$賬戶名 = 'xxxx'
[scriptblock]$測試命令 =
{
 get-childitem d:\
} 
$連接2 = New-PSSession -HostName $服務器ip -UserName $賬戶名
#這里將提示你輸入密碼
$要返回的內容 = Invoke-Command -ScriptBlock $測試命令 -Session $連接2
$要返回的內容
$要返回的內容.name  # dir 返回的文件名

 

 
問: powershell的New-PSSession能把密碼寫在腳本中么
答:
不能。
 
 
問: ssh如何免密?
答:
使用用戶私鑰文件。
$連接3 = New-PSSession -HostName $遠程ip -UserName $賬戶名 -keyfile c:\Users\userabcd\.ssh\id_rsa
 
 
 
問:ssh如何復制,用戶公鑰到服務器?
答:
https://www.cnblogs.com/piapia/p/10412550.html
 
 
客戶機本地的ps1腳本,放在遠程ssh+powershell服務器上執行
在客戶機上:
Invoke-Command -FilePath d:\abc.ps1 -Session $連接4
 
 
客戶機本地的命令,放在遠程ssh+powershell服務器上執行
在客戶機上:
Invoke-Command -ScriptBlock $測試命令 -Session $連接5
 
 
在遠程sshd+powershell服務器上執行,命令,腳本
在客戶機上:
Invoke-Command -ScriptBlock { get-date; d:\xxx.ps1 ;#或 /tmp/a.ps1 } -Session $連接6
 

問:如何scp文件?
答:
scp /tmp/abc.tar.gz   your_name@ip:d:\dir123
openssh官方現在不建議使用scp了。建議使用sftp。
 
 
問:如何sftp文件?
答:
用powershell的winscp第三方模塊。
開源免費軟件,支持圖形,也支持命令行。win,linux通用。
install-module winscp
 
 
 


免責聲明!

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



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