下載:
https://github.com/PowerShell/Win32-OpenSSH/releases
https://github.com/PowerShell/Win32-OpenSSH/releases
問:為什么要用這個sshd?
答:
這是微軟用,openssh官方的源碼,
源碼網址:
https://github.com/PowerShell/openssh-portable
被微軟編譯后的2進制程序。2進制程序上,有微軟的簽名。
win下,免費的sshd,是不是微軟這個版本最新?並且開放源碼?
不建議使用其他公司的閉源sshd,里面可能有后門。
而且收費的sshd,雖然軟件比較新,但一般都是閉源的。
不建議使用,n年前的低版本sshd,軟件太老有漏洞。
不建議使用其他公司的閉源sshd,里面可能有后門。
而且收費的sshd,雖然軟件比較新,但一般都是閉源的。
不建議使用,n年前的低版本sshd,軟件太老有漏洞。
解壓:可以解壓到任意目錄。
建議解壓到:
d:\OpenSSH_Win64_7.9p1
不建議安裝在c盤。
建議解壓到:
d:\OpenSSH_Win64_7.9p1
不建議安裝在c盤。
安裝:
powershell.exe -ExecutionPolicy Bypass -File install-sshd.ps1
powershell.exe -ExecutionPolicy Bypass -File install-sshd.ps1
服務名為:
sshd
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
生成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
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服務啟動。
答:
這個文件存儲在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
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
New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShellCommandOption -Value "/c" -PropertyType String -Force
目的:
讓(win,linux)ssh服務器,接收來自客戶機【powershell的連接】:
管理員權限運行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
如PowerShell-6.2.0-win-x64.msi
3目的:由於sshd不支持帶空格的路徑,所以要給它
建立一個鏈接目錄。
New-Item c:\pwsh -ItemType SymbolicLink -Target 'C:\Program Files\PowerShell\6'
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傳遞的是【代碼塊】。特色是【對象墊底,大花括號圍邊】。
bash的遠程命令,簡單直接。就好像我左手這盤蛋炒飯,簡單解餓,但是不夠強。更適用於 簡單遠程命令場合。
你再看看我右手這盤蓋飯好在哪?答:生菜墊底,蘿卜雕花圍邊。
bash遠程傳遞的是【字符串】,powershell傳遞的是【代碼塊】。特色是【對象墊底,大花括號圍邊】。
字符串傳遞到遠程時,經常需要要轉義。代碼塊不用。
代碼塊,支持多行,格式化,使代碼美觀。
變量名,函數名支持中文。
代碼塊,支持多行,格式化,使代碼美觀。
變量名,函數名支持中文。
代碼塊中,支持引用客戶端變量,一律加上【$using:】,即客戶機上的【$a】,在服務器上叫【$using:a】
代碼塊中,支持引用服務器端變量,即服務器上的【$a】,在服務器還上叫【$a】
即使變量重名,兩個$a也絕不會弄混。
強類型變量,在遠程使用,無需序列化/反序列化。這點py不行。java不行。
代碼塊中,支持引用服務器端變量,即服務器上的【$a】,在服務器還上叫【$a】
即使變量重名,兩個$a也絕不會弄混。
強類型變量,在遠程使用,無需序列化/反序列化。這點py不行。java不行。
ps用大花括號包圍代碼,不用單雙引號,代碼嵌套很容易。
而代碼嵌套容易,使的ps的ssh遠程,從server1(跳板機,堡壘機)經ssh進入server2,再ssh進入server3,進入33層ssh server執行命令很容易。而shell難。
而代碼嵌套容易,使的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相同。
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
答:
使用用戶私鑰文件。
$連接3 = New-PSSession -HostName $遠程ip -UserName $賬戶名 -keyfile c:\Users\userabcd\.ssh\id_rsa
問:ssh如何復制,用戶公鑰到服務器?
答:
https://www.cnblogs.com/piapia/p/10412550.html
答:
https://www.cnblogs.com/piapia/p/10412550.html
客戶機本地的ps1腳本,放在遠程ssh+powershell服務器上執行:
在客戶機上:
Invoke-Command -FilePath d:\abc.ps1 -Session $連接4
在客戶機上:
Invoke-Command -FilePath d:\abc.ps1 -Session $連接4
客戶機本地的命令,放在遠程ssh+powershell服務器上執行:
在客戶機上:
Invoke-Command -ScriptBlock $測試命令 -Session $連接5
在客戶機上:
Invoke-Command -ScriptBlock $測試命令 -Session $連接5
在遠程sshd+powershell服務器上執行,命令,腳本:
在客戶機上:
Invoke-Command -ScriptBlock { get-date; d:\xxx.ps1 ;#或 /tmp/a.ps1 } -Session $連接6
在客戶機上:
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
答:
用powershell的winscp第三方模塊。
開源免費軟件,支持圖形,也支持命令行。win,linux通用。
install-module winscp