Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
某些Unix命令失败时会出现“错误”&书信电报;指挥部>;“未找到”;,使用Python Paramiko exec_命令执行时_Python_Shell_Ssh_Paramiko - Fatal编程技术网

某些Unix命令失败时会出现“错误”&书信电报;指挥部>;“未找到”;,使用Python Paramiko exec_命令执行时

某些Unix命令失败时会出现“错误”&书信电报;指挥部>;“未找到”;,使用Python Paramiko exec_命令执行时,python,shell,ssh,paramiko,Python,Shell,Ssh,Paramiko,我试图在Paramikoexec_命令的帮助下,从Python在Unix服务器上运行sesu命令。但是,当我运行这个命令exec_命令('sesu test')时,我得到 sh:sesu:找不到 当我运行simplels命令时,它会给我所需的输出。只有使用sesu命令,它才能正常工作 我的代码是这样的: import paramiko host = host username = username password = password port = port ssh=paramiko.SS

我试图在Paramiko
exec_命令的帮助下,从Python在Unix服务器上运行
sesu
命令。但是,当我运行这个命令
exec_命令('sesu test')
时,我得到

sh:sesu:找不到

当我运行simple
ls
命令时,它会给我所需的输出。只有使用
sesu
命令,它才能正常工作

我的代码是这样的:

import paramiko

host = host
username = username
password = password
port = port

ssh=paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(ip,port,username,password)
stdin,stdout,stderr=ssh.exec_command('sesu test')
stdin.write('Password')
stdin.flush()
outlines=stdout.readlines()
resp=''.join(outlines)
print(resp)

默认情况下,
SSHClient.exec_命令
不会在“登录”模式下运行shell,也不会为会话分配伪终端。因此,与常规交互式SSH会话(尤其是非交互式会话,
.bash\u profile
未来源)相比,您(可能)获得了一组不同的启动脚本。根据
术语
环境变量的缺失/存在,在脚本中采用和/或不同的分支

可能的解决方案(按优先顺序):

  • 修复命令,使其不依赖于特定环境。在命令中使用sesu的完整路径。例如:

    /bin/sesu测试
    
    如果您不知道完整路径,在通用*nix系统上,可以在交互式SSH会话中使用
    哪个sesu
    命令

  • 修复启动脚本,将交互式和非交互式会话的
    路径设置为相同

  • 尝试通过登录shell显式运行脚本(使用公共*nix shell使用
    --login
    开关):

  • 如果命令本身依赖于特定的环境设置,并且无法修复启动脚本,则可以在命令本身中更改环境。其语法取决于远程系统和/或shell。在通用*nix系统中,此功能可以:

     PATH="$PATH;/path/to/sesu" && sesu test
    
  • 另一种(不推荐)方法是使用
    get_pty
    参数强制为“exec”通道分配伪终端:

     stdin,stdout,stderr=ssh.exec_command('sesu test', get_pty=True)
    
    使用伪终端自动执行命令可能会带来严重的副作用。例如,见


  • 您可能在
    LD\u LIBRARY\u PATH
    和查找共享对象时遇到类似问题


    另见:


    您可能应该建议使用
    command-V
    而不是
    which
    。现在已经没有多少系统
    哪个
    是完全错误的了;但既然有安全的POSIX替代品,为什么还要冒险呢?
    
     stdin,stdout,stderr=ssh.exec_command('sesu test', get_pty=True)