Bash + Python中的EoF / Ctrl + D命令

时间:2017-01-03 16:09:17

标签: python linux bash

我试图在python中创建一些函数,这样我就可以连接到linux终端并做一些事情(比如在这种情况下,创建一个文件)。我的代码,部分工作。唯一不起作用的是你想在输入代码后做某事。比如你创建文件然后想要导航到其他地方(例如cd / tmp)。它不会执行下一个命令,只会添加到创建的文件中。

    def create_file(self, name, contents, location):
        try:
            log.info("Creating a file...")
            self.device.execute("mkdir -p {}".format(location))
            self.cd_path(location)
            self.device.sendline("cat > {}".format(name))
            self.device.sendline("{}".format(contents))
            self.device.sendline("EOF")  # send the CTRL + D command to save and exit I tried here with ^D as well
        except:
            log.info("Failed to create the file!")

该文件的内容是:

cat test.txt
#!/bin/bash
echo "Fail Method Requested"
exit 1
EOF
ls -d /tmp/asdasd

执行的命令顺序为:

execute.create_file(test.txt, the_message, the_location)
execute.check_path("/tmp/adsasd") #this function just checks with ls -d if the directory exists.

我尝试使用sendline以下组合: ^D, EOF, <<EOF

我真的不明白我是如何做到这一点的。我只想创建一个包含特定消息的文件。 (在研究如何使用VI时我遇到了同样的问题,但是我需要的命令就是ESC的命令)

如果有人可以帮助提供一些很棒的输入!!

编辑:正如Rob在下面提到的,发送角色&#34; \ x04&#34;实际上有效。对于遇到此问题的其他人,如果需要,您还可以参考此图表以获取其他组合: http://donsnotes.com/tech/charsets/ascii.html

2 个答案:

答案 0 :(得分:5)

你可能需要发送EOF字符,通常是CONTROL-D,而不是三个字符EOF

        self.device.sendline("\x04")

答案 1 :(得分:2)

http://wiki.bash-hackers.org/syntax/redirection#here_documents

此处docs允许您使用任何您喜欢的文件输入终止字符串来表示文件末尾(例如您现在尝试使用的文字EOF)。引用该字符串告诉shell不要解释heredoc内容中的扩展,确保将所述内容视为文字。

在此处使用pipes.quote()可确保带有文字引号,$ s,空格或其他令人惊讶的字符的文件名不会破坏您的脚本。 (当然,你需要import pipes;相比之下,在Python 3上,这已经转移到了shlex.quote()

self.device.sendline("cat > {} <<'EOF'".format(pipes.quote(name)))

然后您可以按原样编写EOF,告诉bash将其解释为文件输入的结尾。