2013-02-08 3 views
1

Просто немного фона, я пишу скрипт для ssh на несколько удаленных серверов и копирую свой открытый ключ. Я приступил к написанию клиента custon ssh, потому что я не могу установить какие-либо внешние модули python. Короче говоря, компания, над которой я работаю, говорит, что если она не входит в стандартную библиотеку python, вы не можете ее использовать.python ssh script error

После нескольких недель поиска я нашел сценарий, который, как я думал, был ответом на все мои молитвы. Я изменил его в соответствии с моими потребностями, но получаю переменную, не найденную ошибку, и мне нужно небольшое руководство по ее определению.

Вот сценарий:

#!/usr/bin/python 

import pty, re, os, sys, stat, socket 
from getpass import getpass 

class ssherror(Exception): 
    def __init__(self, value): 
     self.value = value 
    def __str__(self): 
     return repr(self.value) 

class sshclient: 
    def __init__(self, ip, passwd, user, port): 
     self.ip = ip 
     self.passwd = passwd 
     self.user = user 
     self.port = port 

    def runcmd(self, c): 
     (pid, f) = pyt.fork() 
     if pid == 0: 
      os.execlp("ssh", "ssh", '-p %d' % self.port, self.user + '@' + self.ip, c) 
     else: 
     return (pid, f) 

    def pushfile(self, src, dst): 
     (pid, f) = pty.fork() 
     if pid == 0: 
      os.execlp("scp", "scp", '-P %d' % self.port, src, self.user + '@' + self.ip + ':' + dst) 
     else: 
      return (pid, f) 

    def pushdir(self, src, dst): 
     (pid, f) = pty.fork() 
     if pid == 0: 
      os.execlp("scp", "scp", '-P %d' % self.port, "-r", src, self.user + '@' + self.ip + ':' + dst) 
     else: 
      return (pid, f) 

    def _read(self, f): 
     x = '' 
     try: 
      x = os.read(f, 1024) 
     except Exception, e: 
      pass 
     return x 

    def connect(self, pid, f): 
     output = '' 
     got = self._read(f) 
     m = re.search('authenticity of host', got) 
     if m: 
      os.write(f, 'yes\n') 
      while True: 
       got = self._read(f) 
       m = re.search('Permanently added', got) 
       if m: 
        break 

      got = self._read(f) 
     m = re.search('assword:', got) 
     if m: 
      os.write(f, self.passwd + '\n') 
      tmp = self._read(f) 
      tmp += self._read(f) 
      m = re.search('Permission denied', tmp) 
      if m: 
       raise Exception('Invalid passwd') 
      got = tmp 
     while got and len(got) > 0: 
      output += got 
      got = self._read(f) 
     os.waitpid(pid, 0) 
     os.close(f) 
     return output 

    def cmd(self, c): 
     (pid, f) = self.runcmd(c) 
     return self.connect(pid, f) 

    def push(self, src, dst): 
     s = os.stat(src) 
     if stat.S_ISDIR(s[stat.ST_MODE]): 
      (pid, f) = self.pushdir(src, dst) 
     else: 
      (pid, f) = self.pushfile(src, dst) 
     return self.connect(pid, f) 



def sshconnect(ip, passwd, user, port=22): 
    s = sshclient(ip, passwd, user, port) 
    return s.connect(pid, f) 


def sshpush(ip, passwd, src, dst, user, port=22): 
    s = sshclient(ip, passwd, user, port) 
    return s.push(src, dst) 



passwd = getpass() 
src = '/path/to/dir/being/copied' 
dst = '/path/to/destination/directory' 
user = os.getlogin() 
port = portnum 
hosts = ['host1', 'host2', 'host3'] 
for host in hosts: 
    try: 
     s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    except socket.error, msg: 
     print 'Failed to create socket. Error code: ' + str(msg[0]) + ' , Error message : ' + msg[1] 
     sys.exit() 

    print 'Socket Created' 
    try: 
     ip = socket.gethostbyname(host) 
    except socket.gaierror: 
     print 'Hostname could not be resolved. Exiting...' 
     sys.exit() 

    print 'Ip address of ' + host + ' is ' + ip 
    sshconnect(ip, passwd, user, port) 
    sshpush(ip, passwd, src, dst, user, port=22) 
    print 'ssh directory copied to ' + host 

Я сделал довольно много изменений к нему, но я все еще получаю следующее сообщение об ошибке:

Traceback (most recent call last): 
    File "ssh.py", line 129, in <module> 
    sshconnect(ip, passwd, user, port) 
    File "ssh.py", line 99, in sshconnect 
    return s.connect(pid, f) 
NameError: global name 'pid' is not defined 

Я знаю, что нужно определить идентификатор процесса , но я рисую пробел, чтобы лучше это делать. Любая помощь, предложения, Advil были бы наиболее искренне оценены !!!

+1

Серьезно. Что это за компания? Одним из самых больших преимуществ Python является огромное количество доступных пакетов. – RickyA

+0

У вас нет имени var pid, объявленного, ни внутри функции, ни в качестве аргумента, ни глобального. Поскольку я не совсем понимаю причину такой структуры, я не могу вам помочь. – 2013-02-08 21:11:04

+0

RickyA - не заводи меня! LOL Я сделал с ними тот же аргумент, пока не стал синим, но когда у вас есть технические специалисты, принимающие технические решения, вы попадаете в такие ситуации ... –

ответ

1

Опечатки на линии:

20: (pid, f) = pyt.fork() (должен быть псевдотерминал)

24: ничего после else:

93: pid и f не определены в этой области видимости функции -> это ваш проблема.

106: portnum не известно в этой области

ли они позволяют использовать proper IDE с проверкой кода? Переключитесь. В противном случае, если вам нравится это barebone vi пойти на статический источник checker.

Глядя на фрагменте кода Пола Микезелл Я думаю, вам не нужна ваша sshconnect функцию в строке 91. Просто сделайте вызов sshclient.push, как вы делаете в вашей следующей функции (sshpush) и соединит для себя.

+0

Получил его. Понял. Убирайся! Я знаю, что мне нужно их определить, мне просто нужно выяснить, как это сделать. portnum не является фактическим значением, я просто использовал его как разделитель. И у меня есть IBM RSA для WebSphere .... –