在Bash中,如果没有建立SFTP连接,是否可能抛出错误?

时间:2015-09-14 18:22:23

标签: python bash sftp

我能够使用Bash脚本连接到SFTP连接但想要考虑错误的连接,例如没有互联网连接,密钥文件变坏等等。

如果连接错误,有没有办法在Bash中抛出错误?如果密钥错误,SFTP似乎会自动拒绝权限,然后关闭连接。

这在Python中可行吗?

1 个答案:

答案 0 :(得分: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