def execute(self,command):
to_exec = self.transport.open_session()
to_exec.exec_command(command)
print 'Command executed'
connection.execute("install.sh")
当我检查远程系统时,发现脚本没有运行。有线索吗?
execute
函数中:from paramiko import SSHClient
host="hostname"
user="username"
client = SSHClient()
client.load_system_host_keys()
client.connect(host, username=user)
stdin, stdout, stderr = client.exec_command('./install.sh')
print "stderr: ", stderr.readlines()
print "pwd: ", stdout.readlines()
注意,命令将默认运行在你的$HOME
目录下,因此你需要将install.sh
文件放在$PATH
环境变量中,或者(更可能)你需要先使用cd
命令切换到包含install.sh
脚本的目录。
你可以通过以下命令检查默认路径:
stdin, stdout, stderr = client.exec_command('getconf PATH')
print "PATH: ", stdout.readlines()
然而,如果它不在您的路径中,您可以使用 cd
命令进入目录并像这样执行脚本:
stdin, stdout, stderr = client.exec_command('(cd /path/to/files; ./install.sh)')
print "stderr: ", stderr.readlines()
print "pwd: ", stdout.readlines()
如果脚本不在您的$PATH
中,您需要使用./install.sh
而不是install.sh
,就像在命令行上一样。install.sh
文件的权限。stdin, stdout, stderr = client.exec_command('ls -la install.sh')
print "permissions: ", stdout.readlines()
install.sh
脚本位于 SSH 服务器的 ssh 工作目录下。运行 Python 脚本的 SSH 客户端可能没有这个文件。是否有一种方法可以在不先复制文件的情况下,在服务器上运行客户端找到的 shell 脚本? - jxramosssh = paramiko.client.SSHClient()
ssh.set_missing_host_key_policy(paramiko.client.AutoAddPolicy())
ssh.connect(hostname=host, username=username, password = password)
chan = ssh.invoke_shell()
def run_cmd(cmd):
print('='*30)
print('[CMD]', cmd)
chan.send(cmd + '\n')
time.sleep(2)
buff = ''
while chan.recv_ready():
print('Reading buffer')
resp = chan.recv(9999)
buff = resp.decode()
print(resp.decode())
if 'password' in buff:
time.sleep(1)
chan.send(password + '\n')
time.sleep(2)
print('Command was successful: ' + cmd)
subprocess
模块,因为它不仅更麻烦,而且您也无法依赖于从ssh
返回的返回代码,因为如果它返回错误代码255,则无法确定这是否是您的远程脚本返回的内容,还是只是由于与远程脚本完全无关的错误而导致ssh
返回代码。 - aculich
ssh
,但 Fabric 是更好的处理 @kevin 可能要解决的更一般问题的方法。 - aculich