有个需求需要在一台机器上通过非手动登录的方式在另一台机器上执行命令,于是我找到了Python的paramiko模块,SSHclient可以满足要求执行命令。过了一阵子测试发现有的命令执行不了,错误提示是:command not found,但是在目标机器上可以执行,无语啊。。。验证了一下测试的说法,怀疑是环境变量的问题,但是还是不懂该怎么设置,上百度搜索一波,找了几个相同问题的博客,但是他们的解决方法试过了本地都不行,期间发现一个说明shell模式的博客,讲的很细致,有一个关键点——通过SSH执行命令脚本时在脚本的第一行加上注释#!/bin/bash --login 这样就能解决环境变量的问题,我验证了一下的确可行,但是我不想改当前的代码,把执行的命令全部封装成文件,心好累。继续搜索,后来在Google上搜索了一下paramilko command not found,终于在Stack Overflow上找到了答案
stdin, stdout, stderr = ssh.exec_command("bash -lc 'echo $PATH'")
,抱着试一下的态度验证成功了,哈哈,皇天不负有心人呀,结合之前搜索的博客,我好想有点明白了,在机器上输入命令man bash,看了一遍命令的参数说名,原来bash 的参数 -l 和 --login功能相同,即可以设置bash为前面博文提到的shell 的一种login模式,这样环境变量就是正常的了。然后我把所有的命令都封装了一下加上了 bash -lc
的外壳,在测试那边通过了验证,嘿嘿。
参考博文:shell模式说明
https://stackoverflow.com/questions/17661657/python-paramiko-ssh-session-does-not-get-the-system-path