********************************************************天道酬勤*************************************************************

Python编程使用paramiko模块的ssh远程linux执行shell报错

“Cannot find a Java JDK. Please set either set JAVA or put java (>=1.5) in your PATH.”

具体代码如下:

ssh = paramiko.SSHClient()

ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

ssh.connect(ip,port,username,password)

stdin, stdout, stderr = ssh.exec_command (\'/root/jetty-8.1.21/bin/jetty.sh  start\')

print(\"结果:\"+str(stdout.read()))

运行结果:

结果:b\'Cannot find a Java JDK. Please set either set JAVA or put java (>=1.5) in your PATH.\\n\'

 

解决方法:

stdin, stdout, stderr = ssh.exec_command (\'source /etc/profile;/root/commands/stop_jetty.sh\')

source /etc/profile 为使JAVA环境变量生效 以此类推其他环境变量生效。

有的环境变量配置在用户.bash_profile文件里,请根据实际情况修改。

 

以下是历史分析过程,可忽略。。。。。

test.sh在linux上是可以单独执行成功的,而且linux上jdk是配置的,一直找不到原因。后来从网上看到exec_command的解释

exec_command参数使用只需要执行一次的命令,因为执行完该命令以后,shell会自动回到ssh初始连接的shell状态下。。。

怀疑是类似于jetty.sh这种多命令的shell文件不能用exec_command去执行

然后修改实现方式,通过创建伪终端的方式实现:

chan = ssh.invoke_shell() #创建一个交互式的shell终端

chan.send(\'sh /root/commands/stop_task.sh\') #利用send函数发送命令,\'\\n\'做回车来执行shell命令。telnet的换行符是\\r\\n
chan.send(\'\\n\')
buff = \'\'
# m = 0
while not buff.endswith(\'# \'):
    resp = chan.recv(9999).decode()
    buff +=resp
    # m += 1
    # print(m)

result  = buff
print(result)

后来到paramiko的官网查找exec_command信息,应该是要设置exec_command函数中的environment参数来指定对应的命令所需的环境变量。只能先mark下,不知道应该怎么设置。

http://www.paramiko.org/changelog.html?highlight=exec_command

\"\"

收藏 打印