Просто немного фона, я пишу скрипт для 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 были бы наиболее искренне оценены !!!
Серьезно. Что это за компания? Одним из самых больших преимуществ Python является огромное количество доступных пакетов. – RickyA
У вас нет имени var pid, объявленного, ни внутри функции, ни в качестве аргумента, ни глобального. Поскольку я не совсем понимаю причину такой структуры, я не могу вам помочь. – 2013-02-08 21:11:04
RickyA - не заводи меня! LOL Я сделал с ними тот же аргумент, пока не стал синим, но когда у вас есть технические специалисты, принимающие технические решения, вы попадаете в такие ситуации ... –