pythonssh破解
① ssh暴力破解的後果
對伺服器性能是會有一些影響,但最大的影響是你的伺服器root密碼被破解,被完全控制。ssh攻擊的目的就是暴力破解你的密碼。最直接的影響就是設備癱瘓(伺服器死機)SSH暴力破解是指攻擊者通過密碼字典或隨機組合密碼的方式嘗試登陸伺服器(針對的是全網機器),這種攻擊行為一般不會有明確攻擊目標,多數是通過掃描軟體直接掃描整個廣播域或網段。 怎樣防禦暴力破解攻擊?一:系統及網路安全1、定期檢查並修復系統漏洞2、定期修改SSH密碼,或配置證書登陸3、修改SSH埠4、禁Ping5、若你長期不需要登陸SSH,請在面板中將SSH服務關閉6、安裝懸鏡、雲鎖、安全狗等安全軟體(只安裝一個)
② linux SSH異地登錄安全提醒功能
這個功能確實很實用。
對於不能實時收郵件的同志來說
如果能發手機簡訊通知就更好了。
③ Denyhost防止SSH暴力破解
Denyhost安裝:
wget https://netix.dl.sourceforge.net/project/denyhosts/denyhosts/2.10/denyhosts-2.10.tar.gz
tar -xzf DenyHosts-2.10.tar.gz
cd DenyHosts-2.10
python setup.py install
Denyhost配置及運行:
cp denyhosts.cfg-dist denyhosts.cfg
cp daemon-control-dist daemon-control
chmod 700 daemon-control
./daemon-control start
Denyhost效果:
從Denyhost的運行日誌中看出,對目標主機的多次SSH密碼試錯觸發了Denyhost的防禦功能。攻擊者的IP被添加至hosts.deny文件,該IP下的SSH訪問也被拒止。
ping不通,ssh不上!!!!效果剛剛的!!
恢復過程:
1.關閉停止denyhost
/data/software/denyhosts-2.10/daemon-control stop
2.將
/var/log/secure
/etc/hosts.deny
/data/denyhosts-data/* 這個3個下的所有文件的相關ip清除掉
3.清空防火牆規則:
iptables -F
4.重啟rsyslog
systemctl restart rsyslog
5.啟動denyhost
/data/software/denyhosts-2.10/daemon-control start
④ 純干貨!python 在運維中的應用 (一):批量 ssh/sftp
日常工作中需要大量、頻繁地使用ssh到伺服器查看、拉取相關的信息或者對伺服器進行變更。目前公司大量使用的shell,但是隨著邏輯的復雜化、腳本管理的精細化,shell已經不滿足日常需求,於是我嘗試整合工作中的需求,製作適合的工具。 由於管理制度的缺陷,我以工作流程為核心思考適合自己的運維方式,提升工作效率,把時間留給更有價值的事情。 完整代碼在最後,請大家參考。
生產:4000+物理伺服器,近 3000 台虛擬機。
開發環境:python3.6、redhat7.9,除了paramiko為第三方模塊需要自己安裝,其他的直接import即可。
批量執行操作是一把雙刃劍。批量執行操作可以提升工作效率,但是隨之而來的風險不可忽略。
風險案例如下:
掛載很多數據盤,通常先格式化硬碟,再掛載數據盤,最後再寫入將開機掛載信息寫入/etc/fstab文件。在批量lsblk檢查硬碟信息的時候發現有的系統盤在/sda有的在/sdm,如果不事先檢查機器相關配置是否一致直接按照工作經驗去執行批量操作,會很容易造成個人難以承受的災難。
在執行批量操作時按照慣例:格式化硬碟->掛載->開機掛載的順序去執行,假設有的機器因為某些故障導致格式化硬碟沒法正確執行。在處理這類問題的時候通常會先提取出失敗的ip,並再按照慣例執行操作。運維人員會很容易忽略開機掛載的信息已經寫過了,導致復寫(這都是血和淚的教訓)。
所以,為了避免故障,提升工作效率,我認為應當建立團隊在工作上的共識,應當遵守以下原則:
當然,代碼的規范也應當重視起來,不僅是為了便於審計,同時也需要便於溯源。我認為應當注意以下幾點:
1、ssh no existing session,sftp超時時間設置:
在代碼無錯的情況下大量ip出現No existing session,排查後定位在代碼的寫法上,下面是一個正確的示例。由於最開始沒考慮到ssh連接的幾種情況導致了重寫好幾遍。另外sftp的實例貌似不能直接設置連接超時時間,所以我採用了先建立ssh連接再打開sftp的方法。
2、sftp中的get()和put()方法僅能傳文件,不支持直接傳目錄:
不能直接傳目錄,那換個思路,遍歷路徑中的目錄和文件,先創建目錄再傳文件就能達到一樣的效果了。在paramiko的sftp中sftp.listdir_attr()方法可以獲取遠程路徑中的文件、目錄信息。那麼我們可以寫一個遞歸來遍歷遠程路徑中的所有文件和目錄(傳入一個列表是為了接收遞歸返回的值)。
python自帶的os模塊中的os.walk()方法可以遍歷到本地路徑中的目錄和文件。
3、多線程多個ip使用sftp.get()方法時無法並發。
改成多進程即可。
4、多個ip需要執行相同命令或不同的命令。
由於是日常使用的場景不會很復雜,所以借鑒了ansible的playbook,讀取提前准備好的配置文件即可,然後再整合到之前定義的ssh函數中。
同時,我們還衍生出一個需求,既然都要讀取配置,那同樣也可以提前把ip地址准備在文件里。正好也能讀取我們返回的執行程序的結果。
參數說明:
密碼認證:
公鑰認證:
可以配合 grep,awk 等命令精準過濾。
個人認為 Python 在初中級運維工作中的性質更像是工具,以提升工作效率、減少管理成本為主。可以從當前繁瑣的工作中解脫出來,去 探索 更有價值的事情。python 本質上並不會減少故障的產生,所以在不同的階段合理利用自身掌握的知識解決當前最重要的痛點,千萬不要本末倒置。
⑤ python腳本ssh命令行可以登錄並執行相應命令,但是腳本總是報錯,何解
編輯「/usr/local/python269/lib/python2.6/site-packages/pexpect/__init__.py
」,將「 raise EOF(str(err) + '\n' + str(self))」這段代碼注釋掉,程序正常運行
有些 UNIX 平台,當你讀取一個處於 EOF 狀態的文件描述符時,會拋出異常,注釋掉就可以了
⑥ python如何通過串口SSH登錄伺服器
需要寫一個基於串口通信協議的ssh伺服器和客戶端,伺服器部署到linux上,客戶端在windows上;
其次,客戶端要提供sdk for python;
最後,你就可以用python通過ssh登錄linux了。
⑦ 如何用python開發一個ssh客戶端工具
1)通過paramiko的ssh模塊連接指定主機;
2)通過SSHClient.exec_command在遠程主機上執行命令;
3)通過exec_command返回的stdout,stdin,stderr進行交互;
4)保存成功連接的主機信息(session),可以通過ls命令查看,sessionid命令,直接啟動新連接;
5)可在windows和linux下運行,寫程序時需要注意他們的差別。
代碼ssh.py
#!/usr/bin/python
#-*-coding:utf-8-*-
importos,sys
importparamiko
importthreading
importplatform
curr_ssh=None
curr_prompt=">>"
#使用說明
defprintUsage():
print"!ls:listsessions."
print"!sessionid:connectsession."
print"!connhostuserpassword:connecthostwithuser."
print"!exit:exit."
#連接
defconn(ip,username,passwd):
try:
ssh=paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(ip,22,username,passwd,timeout=5)
print"Connectto",ip,"with",username
globalcurr_prompt
curr_prompt=username+"@"+ip+">>"
returnssh
except:
returnNone
#載入以前的連接信息
sessions=[]
defloadSessions():
globalsessions
try:
f=open("sessions")
sessions=f.readlines()
f.close()
except:
pass
#執行本地命令,ssh.py的命令
defexe_cmd_local(cmd):
if(cmd=="!ls"):
loadSessions()
globalsessions
i=0
print"Sessions:"
forsinsessions:
print"[%d]%s"%(i,s)
i+=1
else:
vals=cmd.split('')
if(vals[0]=="!session"):
id=(int)(vals[1])
if(id<len(sessions)):os_name="platform.system()"new_console_cmd=""if(os_name="=""linux"):="".=""ssh.py="""=""+=""sessions[id]+"""=""elif(os_name="=""windows"):=""sessions[id]=""os.system(new_console_cmd)=""else:=""print="""didn't=""hava=""sessoin=""",vals[1]=""elif(vals[0]="="!conn"):"global=""curr_ssh=""f="open("sessions","a")"line="vals[1]+"""+vals[2]+"="""+vals[3]+" "=""f.write(line)=""f.close()=""#在ssh連接的主機上執行命令=""def=""exe_cmd_ssh(ssh,cmd):=""if(ssh="="none):=""connect=""to=""a=""server.=""use=""'!conn'=""please."=""return=""stdin,=""stdout,=""stderr="ssh.exec_command(cmd)"#stdin.write("y")=""#簡單交互,輸入=""『y』=""#屏幕輸出=""stdout.read()=""stderr.read()=""#入口函數=""if=""__name__="='__main__':"loadsessions()=""if(len(sys.argv)="=4):"printusage()=""while=""true:=""cmd="raw_input(curr_prompt)"if(len(cmd)="=0):"continue=""if(cmd="=""!exit"):=""if(curr_ssh=""!="None):"curr_ssh.close();=""break=""if(cmd[0]="="'!'):=""exe_cmd_local(cmd)=""exe_cmd_ssh(curr_ssh,cmd)<=""pre="">
⑧ 如何防止SSH暴力破解
SSH防暴力破解的解決方法:
1、禁止root用戶ssh登陸;
1.1、修改PermitRootLogin項:
[root@localhost~]#vi/etc/ssh/sshd_config
[root@localhost~]#grepRoot/etc/ssh/sshd_config
PermitRootLoginno###將默認的#PermitRootLoginyes修改成這樣的###
#thesettingof"PermitRootLoginwithout-password".
- [root@localhost ~]# vi /etc/ssh/sshd_config
- [root@localhost ~]# grep Root /etc/ssh/sshd_config
- PermitRootLogin no ### 將默認的 #PermitRootLogin yes 修改成這樣的 ###
- # the setting of "PermitRootLogin without-password".
Stoppingsshd:[OK]
Startingsshd:[OK]
- Stopping sshd: [ OK ]
- Starting sshd: [ OK ]
[root@localhost~]#vi/etc/ssh/sshd_config
[root@localhost~]#grepPort/etc/ssh/sshd_config
Port2020
#GatewayPortsno
- [root@localhost ~]# vi /etc/ssh/sshd_config
- [root@localhost ~]# grep Port /etc/ssh/sshd_config
- Port 2020
- #GatewayPorts no
[root@localhost~]#vi/etc/sysconfig/iptables
[root@localhost~]#grep2020/etc/sysconfig/iptables
-AINPUT-ptcp-mstate--stateNEW-mtcp--dport2020-jACCEPT
- [root@localhost ~]# vi /etc/sysconfig/iptables
- [root@localhost ~]# grep 2020 /etc/sysconfig/iptables
- -A INPUT -p tcp -m state --state NEW -m tcp --dport 2020 -j ACCEPT
[root@localhost~]#/etc/init.d/iptablesrestart
iptables:SettingchainstopolicyACCEPT:natfilter[OK]
iptables:Flushingfirewallrules:[OK]
iptables:Unloadingmoles:[OK]
iptables:Applyingfirewallrules:[OK]
- [root@localhost ~]# /etc/init.d/iptables restart
- iptables: Setting chains to policy ACCEPT: nat filter [ OK ]
- iptables: Flushing firewall rules: [ OK ]
- iptables: Unloading moles: [ OK ]
- iptables: Applying firewall rules: [ OK ]
[root@localhost~]#/etc/init.d/sshdrestart
Stoppingsshd:[OK]
Startingsshd:[OK]
1.2、重啟sshd服務
2、修改ssh默認埠22;
2.1、將默認埠22修改為自定義的2020埠
2.2、在防火牆中加入2020埠的策略
2.3、重啟防火牆策略
2.4、重啟sshd服務
⑨ 雲主機被ssh暴力破解
剛剛買的雲主機收到告警:【SSH暴力破解】,一開始沒理會,後面發現這幾個IP還經常來試。
這樣放著也不是辦法。
就簡單的做了一些限制:
沒加入黑名單的IP 會 【>> /etc/sshd.deny.hostguard】,已經加入的返回 【echo "ip:$i is in deny"】
測試:
找一台機器ssh你的公網IP
ssh 110.110.110.100 (本機公網IP) 默認22 直接報錯不通:
ssh 110.110.110.100 (本機公網IP) -p 6666 (修改的ssh埠)
121.52.252.24 剛剛腳本觸發的IP
119.8.55.100 (之前觸發的)
159.138.53.153 (之前觸發的)
⑩ python 實現ssh的執行遠端命令和scp的不同機器文件傳輸功能
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import pexpect
def ssh_cmd(ip, passwd, cmd):
ret = -1
ssh = pexpect.spawn('ssh root@%s "%s"' % (ip, cmd))
try:
i = ssh.expect(['password:', 'continue connecting (yes/no)?'], timeout=5)
if i == 0 :
ssh.sendline(passwd)
elif i == 1:
ssh.sendline('yes\n')
ssh.expect('password: ')
ssh.sendline(passwd)
ssh.sendline(cmd)
r = ssh.read()
print r
ret = 0
except pexpect.EOF:
print "EOF"
ssh.close()
ret = -1
except pexpect.TIMEOUT:
print "TIMEOUT"
ssh.close()
ret = -2
return ret
利用pexpect模塊我們可以做很多事情,由於他提供了自動交互功能,因此我們可以實現ftp,telnet,ssh,scp等的自動登錄,還是比較實用的。根據上面的代碼相信讀者已經知道怎麼實現了(python就是那麼簡單!)。
用
上面的代碼去完成任務還是比較費時間的,因為程序要等待自動交互出現,另外ubuntu用ssh連接就是比較慢,要進行一系列的驗證,這樣才體現出ssh
的安全。我們要提高效率,在最短的時間內完成。後來我發現了python裡面的paramiko模塊,用這個實現ssh登錄更加簡單。看下面的代碼:
復制代碼 代碼如下:
#-*- coding: utf-8 -*-
#!/usr/bin/python
import paramiko
import threading
def ssh2(ip,username,passwd,cmd):
try:
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(ip,22,username,passwd,timeout=5)
for m in cmd:
stdin, stdout, stderr = ssh.exec_command(m)
# stdin.write("Y") #簡單交互,輸入 『Y'
out = stdout.readlines()
#屏幕輸出
for o in out:
print o,
print '%s\tOK\n'%(ip)
ssh.close()
except :
print '%s\tError\n'%(ip)
if __name__=='__main__':
cmd = ['cal','echo hello!']#你要執行的命令列表
username = "" #用戶名
passwd = "" #密碼
threads = [] #多線程
print "Begin......"
for i in range(1,254):
ip = '192.168.1.'+str(i)
a=threading.Thread(target=ssh2,args=(ip,username,passwd,cmd))
a.start()
上面的程序還是有些技巧的:
1.
利用多線程,同時發出登錄請求,同時去連接電腦,這樣速度快很多,我試了一下,如果不用多線程,直接一個一個挨著執行的話,大約5~10秒鍾才能對一台電
腦操作完,具體時間要根據命令的來決定,如果是軟體安裝或者卸載時間要更長一些。這樣下來怎麼也要一二十分鍾,用多線程後就快多了,所有的命令執行完用了
不到2分鍾!
2.最好用root用戶登錄,因為安裝或者卸載軟體的時候如果用普通用戶又會提示輸入密碼,這樣又多了一次交互,處理起來就比較麻
煩!安裝軟體時apt-get install xxx
最好加上「-y」參數,因為有時安裝或刪除軟體時提示是否繼續安裝或卸載,這又是一次自動交互!加上那個參數後就沒有人機交互了。
3. 循環時循環所有ip,因為計算機的ip是路由器自動分配的,保險起見,最好全部都執行,保證沒有遺漏的主機
4.遠端執行命令時如果有交互,可以這樣用 stdin.write("Y")來完成交互,「Y」就是輸入「Y」。
5.把所有的命令放到一個列表裡面,遍歷列表可以依次執行列表裡面的命令
6.為了更好的進行控制,最好在電腦上提前把root用戶打開,裝好ssh伺服器並讓其開機自動執行。