2013-07-17 2 views
2

Я запускал файл demo_sftp.py из демонстрационной папки в paramiko github. Я перешагнул его в PyDev и ожидал получить ошибку, потому что у меня не было ключа к серверу, к которому я пытался подключиться, но я получил заявление на печать, в котором говорится, что скрипт не может открыть файл ключа хоста, а затем он пошел вперед, и все получилось.paramiko позволяет подключиться sftp без ключа

Код фрагмента кода.

try: 
    host_keys = paramiko.util.load_host_keys(os.path.expanduser('~/.ssh/known_hosts')) 
except IOError: 
    try: 
     # try ~/ssh/ too, because windows can't have a folder named ~/.ssh/ 
     host_keys = paramiko.util.load_host_keys(os.path.expanduser('~/ssh/known_hosts')) 
    except IOError: 
     print '*** Unable to open host keys file' 
     host_keys = {} 

if host_keys.has_key(hostname): 
    hostkeytype = host_keys[hostname].keys()[0] 
    hostkey = host_keys[hostname][hostkeytype] 
    print 'Using host key of type %s' % hostkeytype 


# now, connect and use paramiko Transport to negotiate SSH2 across the connection 
try: 
    t = paramiko.Transport((hostname, port)) 
    t.connect(username=username, password=password, hostkey=hostkey) 
    sftp = paramiko.SFTPClient.from_transport(t) 

    # dirlist on remote host 
    dirlist = sftp.listdir('.') 
    print "Dirlist:", dirlist 

Я действительно ожидал, что он перейдет к за исключением строки t.connect, поскольку hostkey имеет значение NoneType.

Когда я открываю соединение SSH с

ssh = paramiko.SSHClient() 
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
    try: 
     ssh.connect('.'.join([self.name, self.domain]), 
        username=self.username, password=self.password) 
     stdin, stdout, stderr = ssh.exec_command("ps aux | grep Xvnc | wc -l") 

я должен иметь линию AutoAddPolicy() или выходит из строя. Так в чем разница? Очевидно, я просто изучаю это, но я думал, что sftp будет столь же строгим, как ssh.

ответ

1

Похоже, что это приемлемая практика.

комментарий от Transport.connect

''' 
Negotiate an SSH2 session, and optionally verify the server's host key 
and authenticate using a password or private key. This is a shortcut 
for L{start_client}, L{get_remote_server_key}, and 
L{Transport.auth_password} or L{Transport.auth_publickey}. Use those 
methods if you want more control. 

You can use this method immediately after creating a Transport to 
negotiate encryption with a server. If it fails, an exception will be 
thrown. On success, the method will return cleanly, and an encrypted 
session exists. You may immediately call L{open_channel} or 
L{open_session} to get a L{Channel} object, which is used for data 
transfer. 

@note: If you fail to supply a password or private key, this method may 
succeed, but a subsequent L{open_channel} or L{open_session} call may 
fail because you haven't authenticated yet. 
''' 

комментария от SSHClient.connect

''' 
Connect to an SSH server and authenticate to it. The server's host key 
is checked against the system host keys (see L{load_system_host_keys}) 
and any local host keys (L{load_host_keys}). If the server's hostname 
is not found in either set of host keys, the missing host key policy 
is used (see L{set_missing_host_key_policy}). The default policy is 
to reject the key and raise an L{SSHException}. 
''' 

Может быть, это связанно с тем, что SFTP может только транспортные данные, в то время как SSH может работать терминальные команды. Мне интересно, что нападение «человек в середине» не вызывает беспокойства.

Смежные вопросы