【问题标题】:Use Redefined command from PExpect使用 PExpect 中的重新定义命令
【发布时间】:2013-11-15 15:50:06
【问题描述】:

如何在 bash 脚本中重新定义命令,以便从 bash 脚本调用的 python 脚本在通过 pexpect 调用时执行重新定义的版本?

test.sh

#!/bin/bash
function scp(){
    echo "Skip SCP"
}
export -f scp
python test.py

test.py

import pexpect
scp = pexpect.spawn("scp")
scp.expect([pexpect.EOF,pexpect.TIMEOUT],timeout=1500)
print scp.before    

在这个例子中,我期望(并且希望)看到的是:

跳过 SCP

但我实际看到的是:

用法:scp [-1246BCpqrv] [-c cipher] [-F ssh_config] [-i identity_file]
           [-l 限制] [-o ssh_option] [-P 端口] [-S 程序]
           [[user@]host1:]file1 ... [[user@]host2:]file2

我可以更改有关 shell 脚本的任何内容,但是 python 来自第三方并且被复制到许多不同的项目中,因此更改它是不切实际的。

【问题讨论】:

  • 您可以将scp 设为可执行脚本,并设置$PATH 以便首先找到您的scp 版本。

标签: python bash pexpect


【解决方案1】:

spawn 很可能直接执行它的命令(通过 execv 或其他方式),或者它使用特定的 shell,如 /bin/sh。如果您希望它使用自定义环境,则必须自己指定。我不知道 pexpect,但类似

spawn bash
expect your_prompt
send "function scp { echo 'skip scp'; }"
expect your_prompt
send scp
expect "skip scp"

此外,bash 函数不会导出到子进程,除非您 export -f scp


由于您无法触摸 pexpect 部分,因此您唯一可以更改的是scp。您必须提供一个名为“scp”的程序,该程序出现在路径中比常规 scp 更早

#!/bin/sh
PATH=/my/special/path:$PATH
cat > /my/special/path/scp <<END
#!/bin/sh
echo "no scp here!"
END
chmod 755 /my/special/path/scp

python test.py

【讨论】:

  • 正如我所说,我无法更改 python 脚本,因此无法添加到该脚本中。
  • 它确实使用了execv(或execvpe,如果使用环境变量调用)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-03
  • 1970-01-01
  • 2016-09-07
  • 2017-02-15
  • 1970-01-01
  • 2011-02-05
  • 2013-02-19
相关资源
最近更新 更多