python使用paramiko實現(xiàn)ssh

代碼

myssh.py

import utils
import paramiko
class SSHConnection(object):
    def __init__(self, host, port=22, proxy_name="proxy"):
        self._host = host
        self._port = int(port)
        self._tunnel_server, self._host, self._port, self._username, self._passwords \
            = utils.get_common_ssh_tunnel(proxy_name, self._host, self._port)
        self._password = None
        self._transport = None
        self._sftp = None
        self._client = None
        self._connect()  # 建立連接

    def _connect(self):
        if self._tunnel_server:
            self._tunnel_server.start()

        passwords = self._passwords.split("\n")
        success = False
        transport = None
        for password in passwords:
            try:
                transport = paramiko.Transport((self._host, self._port))
                transport.connect(username=self._username, password=password)
                self._password = password
                success = True
            except Exception as e:
                if transport:
                    transport.close()
                if "Authentication failed." in e:
                    continue
        if success:
            self._transport = transport
        else:
            raise paramiko.AuthenticationException

    # 下載
    def download(self, remotepath, localpath):
        try:
            if self._sftp is None:
                self._sftp = paramiko.SFTPClient.from_transport(self._transport)
            self._sftp.get(remotepath, localpath)
        except Exception as e:
            raise e

    # 上傳
    def put(self, localpath, remotepath):
        try:
            if self._sftp is None:
                self._sftp = paramiko.SFTPClient.from_transport(self._transport)
            self._sftp.put(localpath, remotepath)
        except Exception as e:
            raise e

    # 執(zhí)行命令
    def exec_command(self, command):
        try:
            if self._client is None:
                self._client = paramiko.SSHClient()
                self._client._transport = self._transport
            stdin, stdout, stderr = self._client.exec_command(command)
            data = stdout.read()
            if len(data) > 0:
                print data.strip()  # 打印正確結(jié)果
                return data
            err = stderr.read()
            if len(err) > 0:
                print err.strip()  # 輸出錯誤結(jié)果
                return err
        except Exception as e:
            raise e

    def close(self):
        if self._transport:
            self._transport.close()
        if self._client:
            self._client.close()
        if self._tunnel_server:
            self._tunnel_server.close()

utils.py

def get_common_ssh_tunnel(proxy_server, remote_host, remote_port):
    session = models.get_db_session()
    remote_server = None
    try:
        remote_server = session.query(models.Server).filter(models.Server.host == remote_host).one()
    except Exception as e:
        if "No row was found for one()" in e.message:
            remote_server = session.query(models.Server).filter(models.Server.name == "common").one()
            remote_server.host = remote_host
            remote_server.port = remote_port
    if not remote_server.need_jump:
        return None, remote_server.host, remote_server.port, remote_server
    local_port = utils.get_open_port()
    proxy = session.query(models.Server).filter(models.Server.name == proxy_server).one()
    session.close()
    return SSHTunnelForwarder(
        (proxy.host, int(proxy.port)),
        ssh_username=proxy.username,
        ssh_password=proxy.password,
        remote_bind_address=(remote_host, int(remote_port)),
        local_bind_address=("0.0.0.0", int(local_port))
    ), "127.0.0.1", local_port, remote_server.username, remote_server.password

參考

https://blog.csdn.net/u012322855/article/details/77839929

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末筒繁,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子省撑,更是在濱河造成了極大的恐慌古瓤,老刑警劉巖竭业,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡土浸,警方通過查閱死者的電腦和手機橙凳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門蕾殴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人岛啸,你說我怎么就攤上這事钓觉。” “怎么了坚踩?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵荡灾,是天一觀的道長。 經(jīng)常有香客問我,道長卧晓,這世上最難降的妖魔是什么芬首? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮逼裆,結(jié)果婚禮上郁稍,老公的妹妹穿的比我還像新娘。我一直安慰自己胜宇,他們只是感情好耀怜,可當我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著桐愉,像睡著了一般财破。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上从诲,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天左痢,我揣著相機與錄音,去河邊找鬼系洛。 笑死俊性,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的描扯。 我是一名探鬼主播定页,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼绽诚!你這毒婦竟也來了典徊?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤恩够,失蹤者是張志新(化名)和其女友劉穎卒落,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體玫鸟,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡导绷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了屎飘。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片妥曲。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖钦购,靈堂內(nèi)的尸體忽然破棺而出檐盟,到底是詐尸還是另有隱情,我是刑警寧澤押桃,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布葵萎,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏羡忘。R本人自食惡果不足惜谎痢,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望卷雕。 院中可真熱鬧节猿,春花似錦、人聲如沸漫雕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽浸间。三九已至太雨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間魁蒜,已是汗流浹背囊扳。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留梅惯,地道東北人宪拥。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓仿野,卻偏偏與公主長得像铣减,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子脚作,可洞房花燭夜當晚...
    茶點故事閱讀 44,713評論 2 354