关于 paramiko 多线程 ssh

2019-10-15 23:25:49 +08:00
 Achilless

我现在有 4000 台主机要定时检测他们的 ssh 可达性,思路是 paramiko+线程池并发检测,结果入库。

但是现在遇到个很奇怪的现象,无论线程池设置为 5 或 50,最后的结果都是 100 到 300 之间的数量,根本才执行了 10%都不到。

但是我用差不多的代码推送配置的时候倒是没这问题。

代码在这: http://www.ksprd.top/blog/45/

请问是哪里写的有问题么

1091 次点击
所在节点    问与答
6 条回复
Achilless
2019-10-15 23:58:13 +08:00
搞定了,智障了,没关 ssh
Achilless
2019-10-15 23:59:44 +08:00
现在有另一个顽疾,一直没解决,最后跑完的结果,根据线程池的大小,结果是不一样的。比如 60 个线程的时候,结果是 3300,50 个线程的时候结果是 3000.。。。真要哭了,是 ssh 的坑么
ps1aniuge
2019-10-16 00:16:45 +08:00
win,linux,加 powershell 7 preview 版,若是 linux 则用 sshpass+ssh。

$a = get-content ip.txt
$a | ForEach-Object -ThrottleLimit 50 -Parallel {
# sshpass ssh ip 等
}

powershell [强] [简] 死你!
=========安装==========
你需要把 powershell 改成 powershell-preview,即安装非稳定版的 powershell。

centos7 及以上,安装 powershell:
curl -o /etc/yum.repos.d/microsoft.repo https://packages.microsoft.com/config/rhel/7/prod.repo
sudo yum remove -y powershell #删除旧版
sudo yum install -y powershell
pwsh -c 'mkdir -p "$env:HOME/.config/powershell" '
pwsh -c 'Add-Content -Value "Set-PSReadlineOption -EditMode Windows" -LiteralPath $profile '
pwsh -c 'Add-Content -Value "`nSubsystem powershell /usr/bin/pwsh -sshs -NoLogo -NoProfile" -LiteralPath /etc/ssh/sshd_config '



ubuntu1604:
sudo curl https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add -
sudo curl -o /etc/apt/sources.list.d/microsoft.list https://packages.microsoft.com/config/ubuntu/16.04/prod.list
sudo apt-get update
sudo apt-get remove -y powershell #删除旧版
sudo apt-get install -y powershell
pwsh -c 'mkdir -p "$env:HOME/.config/powershell" '
pwsh -c 'Add-Content -Value "Set-PSReadlineOption -EditMode Windows" -LiteralPath $profile '
pwsh -c 'Add-Content -Value "`nSubsystem powershell /usr/bin/pwsh -sshs -NoLogo -NoProfile" -LiteralPath /etc/ssh/sshd_config '


ubuntu1804:
sudo curl https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add -
sudo curl -o /etc/apt/sources.list.d/microsoft.list https://packages.microsoft.com/config/ubuntu/18.04/prod.list
sudo apt-get update
sudo apt-get remove -y powershell #删除旧版
sudo apt-get install -y powershell
pwsh -c 'mkdir -p "$env:HOME/.config/powershell" '
pwsh -c 'Add-Content -Value "Set-PSReadlineOption -EditMode Windows" -LiteralPath $profile '
pwsh -c 'Add-Content -Value "`nSubsystem powershell /usr/bin/pwsh -sshs -NoLogo -NoProfile" -LiteralPath /etc/ssh/sshd_config '



debian9:
sudo apt-get update
sudo apt-get install curl gnupg apt-transport-https
curl https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add -
sudo sh -c 'echo "deb [arch=amd64] https://packages.microsoft.com/repos/microsoft-debian-stretch-prod stretch main" > /etc/apt/sources.list.d/microsoft.list'
sudo apt-get update
sudo apt-get remove -y powershell #删除旧版
sudo apt-get install -y powershell
pwsh -c 'mkdir -p "$env:HOME/.config/powershell" '
pwsh -c 'Add-Content -Value "Set-PSReadlineOption -EditMode Windows" -LiteralPath $profile '
pwsh -c 'Add-Content -Value "`nSubsystem powershell /usr/bin/pwsh -sshs -NoLogo -NoProfile" -LiteralPath /etc/ssh/sshd_config '




=========资料==========

┏┳━━━━━━━━━━━┓
┃┃███████████┃
┃┃███████████┃
┣┫███████┏━┓█┃
┃┃███████┃P┃█┃
┃┃███████┃O┃█┃
┃┃███秘███┃W┃█┃
┣┫███████┃E┃█┃
┃┃███████┃R┃█┃
┃┃███████┃S┃█┃
┃┃███████┃H┃█┃
┣┫███████┃E┃█┃
┃┃███籍███┃L┃█┃
┃┃███████┃L┃█┃
┃┃███████┗━┛█┃
┣┫███████████┃
┃┃██V7.0 preview3 ██┃
┃┃███████████┃
┗┻━━━━━━━━━━━┛

新增并发参数
| ForEach-Object -Parallel

例子:
1
get-content ip.txt |foreach-object -Parallel{ ping.exe $_ }

2
Get-Content /powershell/ip.txt |ForEach-Object -Parallel {if (Test-Connection -Count 1 -TargetName $_ -Quiet) {$_} } 6>$null

3
$a = 1..100
$a | ForEach-Object -ThrottleLimit 5 -Parallel {
Write-Host $_
Start-Sleep -Seconds 3
}


手册:
https://github.com/PowerShell/PowerShell-RFC/blob/master/4-Experimental-Accepted/RFC0044-ForEach-Parallel-Cmdlet.md

参数:
-Parallel
-ThrottleLimit
-TimeoutSeconds parameter takes an integer that specifies the maximum time to wait for completion before the command is aborted
-AsJob
ly4572615
2019-10-16 09:24:27 +08:00
你们搞得太麻烦了,ansible 了解一下?
k8ser
2019-10-16 09:55:16 +08:00
你网站挂了
ps1aniuge
2019-10-22 13:08:09 +08:00
$a = get-content ip.txt
$a | ForEach-Object -ThrottleLimit 50 -Parallel {
sshpass -p ‘xxx’ ssh user@ip #详细命令略
if ($LASTEXITCODE -ne 0)
{'xx'} else {'yy'}
}

talk is cheap ,show me code .
在安装 bash,python,powershell 的情况下,还有比这更简单的代码么?你倒是贴出来呀。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/609719

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX