2015-09-14 35 views
0

我能夠連接到一個Bash腳本的SFTP連接,但想要解釋不好的連接,比如沒有互聯網連接,密鑰文件不好等。在Bash中,如果SFTP連接未建立,是否可能引發錯誤?

有沒有辦法拋出一個錯誤在Bash中,如果我的連接不好?似乎SFTP自動拒絕權限,如果關鍵是壞的,然後關閉連接。

在Python中這可能嗎?

+2

你想在錯誤上發生什麼?在Bash中,如果發生錯誤,SFTP命令將返回一個非零的退出代碼。你可以在命令後用Bash變量'$?' – Ben

+0

使用'paramiko'來檢查它,這將是可能的 – taesu

+0

我會考慮使用'lftp',它實際上支持sftp(以及scp和甚至通過SSH連接將文件傳輸到符合POSIX標準的shell!),並且(2)同樣將有用的退出代碼報告給調用shell。 –

回答

0

Bash錯誤非常簡單:您可以在腳本中間退出並返回代碼[並將其記錄在某處以便在另一個腳本中進行處理],或者通過if語句處理返回代碼(如重試你的sftp命令)。

您可以使用函數並指定一組返回代碼,以便在單個腳本中以這種方式執行此操作。 Python是一個功能更全面的語言:如果使用庫來執行調用(例如直接創建shell命令的子進程,或者如果通過ssh執行命令,則使用paramiko),您可以更多地捕獲錯誤直接使用try/except塊:

try: 
    rc = subprocess.check_call('ssh 348.3454.342.21', shell=True) # bogus IP 
except CalledProcessError, e: 
    print e 

它會輸出:

ssh: Could not resolve hostname 348.3454.342.21: Name or service not known 
CalledProcessError: Command 'ssh 348.3454.342.21' returned non-zero exit status 255 

的paramiko將對連接失敗之類更明確的錯誤類型。但是,在遠程主機上失敗的paramiko運行的命令不會在遠程設備出錯時拋出錯誤。

def setup_session(server,key_filename): 
    paramiko.util.log_to_file('%s_paramiko.log'%(server)) 
    ssh = paramiko.SSHClient() 
    ssh.load_system_host_keys() 
    ssh.set_missing_host_key_policy(paramiko. 
    try: 
     ssh.connect(server,username='root',key_filename=key_filename) 
    except BadHostKeyException, e: 
     do_badhostkey_thing() 
    except AuthenticationException, e: 
     do_authenticationexception_thing() 
    except SSHException, e: 
     do_sshexception_thing() 
    return ssh 
相關問題