2017-01-03 4 views
0

私は(ファイルを作成し、この場合のように)Linuxの端子に接続して、ものを行うことができるようにpythonでいくつかの機能を作るしようとしています。私が持っているコードは、部分的に動作します。あなたがコードを入力した後に何かしたいのであればうまくいきません。たとえば、ファイルを作成してから、別の場所(cd/tmp)に移動したいとします。次のコマンドを実行する代わりに、作成したファイルに追加するだけです。EoFの/ Ctrlキー+ Dコマンド

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

どのようにして私がマックできるかわからないeこれが起こる。私は、特定のメッセージを含むファイルを作成したいだけです。 (VIでこれを行う方法を研究すると私は同じ問題を抱えて、私は必要なコマンドはESCのための1があった)

誰もが素晴らしいだろういくつかの入力を支援することができれば!

編集:ロブは、文字を送信、後述するように「\ X04」は、実際に動作します。この問題を持つ他の誰のために必要であれば、あなたも他の組み合わせのために、このチャートを参照してくださいすることができます http://donsnotes.com/tech/charsets/ascii.html

+0

'sendline'は実際のテキストをドキュメントに送るわけではないので、EOFを送るためには' execute'が必要です。少なくともそれは私がこれをどのように解釈したか、私はあなたがしていることの多くを理解することができません。 –

+0

ところであなたが考えられている[Ansible](https://github.com/ansible/ansiblae)? – 9000

+0

'self.device'とは何ですか? –

答えて

3

あなたはおそらく、通常CONTROL-D、いない3つの文字EOあるEOF文字を、送信する必要があり、 F。ここで

 self.device.sendline("\x04") 
+0

完全に正確であるために、それはファイル文字の終わりではありません。ファイルの終わりのようなものはありません - それは状態であり、値ではありません。端末は単にctrl-Dを解釈してファイルの終わりを意味します。実際にはEOTキャラクターです。それでも、質問を考えると、これは私よりも良い答えだと思います。 –

+0

これは、 'bash'ではなく、Control-Dの入力に応じて現在のファイルを「閉じる」ターミナルです。 – chepner

+0

良い点@chepner、fixed。 –

2

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

ドキュメントは、あなたが(例えば、あなたが今使用しようとしているリテラルEOFなど)、ファイルの終わりを表現したい任意のファイル入力終端文字列を使用することができます。その文字列を引用すると、コンテンツがリテラルとして扱われたことを確実にすること、ヒアドキュメントのコンテンツ内の拡張を解釈しないようにシェルに指示します。

ここでpipes.quote()を使用すると、リテラル引用符が$であるファイル名、スペース、またはその他の驚くべき文字がスクリプトを壊さないことが保証されます。 (もちろん、あなたがimport pipesする必要があります。Pythonの3の上に、対照的に、これはshlex.quote()に移動しました)。

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

次に、ファイル入力の終わりとして解釈するようにbashに指示したように、EOFをそのまま書き込むことができます。

+1

優れた点!おそらくOPの '.sendline()'呼び出しを使ってここの文書をどのように使用するかを実証することができます。 –

+0

@charlesDuffyの両方の編集を歓迎します –

関連する問題