質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

UNIX

UNIXとは、AT&Tのベル研究所で開発されたコンピューター用のマルチユーザー・マルチタスクのオペレーションシステム(OS)です。政府や教育機関や研究所で広範囲に採用されています。

sh

shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

AWK

AWKは、UNIX 上で開発されたプログラミング言語で、CSVファイルなどのテキストファイルの処理を目的にデザインされています。

Q&A

解決済

3回答

4658閲覧

shellでexpect中のawkがうまくいかない

wi2yuki

総合スコア19

bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

UNIX

UNIXとは、AT&Tのベル研究所で開発されたコンピューター用のマルチユーザー・マルチタスクのオペレーションシステム(OS)です。政府や教育機関や研究所で広範囲に採用されています。

sh

shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

AWK

AWKは、UNIX 上で開発されたプログラミング言語で、CSVファイルなどのテキストファイルの処理を目的にデザインされています。

0グッド

0クリップ

投稿2018/08/07 12:44

編集2018/08/07 12:47

前提・実現したいこと

expectコマンド内でawkを使いたい。
awk内のprintオプションが単独コマンドとして認識されてしまっていて、うまくいっていない様子。

どなたか助けてください、、、

発生している問題・エラーメッセージ

argv[0] = expect argv[1] = -d argv[2] = -c argv[3] = set timeout 60 spawn sudo su expect ":" send "abcde\n" expect "#" send "\cp /tmp/hoge-1.2.3.jar /opt/hoge/lib/\n" expect "上書きしますか?" send "yes\n" expect "#" send "ps -ef | grep /opt/hoge/lib/hoge-*.jar | grep -v grep | awk { argv[4] = print argv[5] = kill -9, argv[6] = $2} \n" set argc 2 set argv0 "print" set argv "{kill -9,} $2\}\ \n\"\n" executing commands from command file print couldn't read file "print": no such file or directory

該当のソースコード

shell

1#!/bin/bash -xe 2 3target_path=/tmp/hoge.jar 4awk_command="awk '{ print \"kill -9\", \$2}'" 5 6ssh -t -t wif_adm_y.sato@192.168.83.75 "expect -d -c ' 7 8 set timeout 60 9 spawn sudo su 10 expect \":\" 11 send \"abcde\n\" 12 expect \"#\" 13 send \"\cp $target_path /opt/hoge/lib/\n\" 14 expect \"上書きしますか?\" 15 send \"yes\n\" 16 expect \"#\" 17 send \"ps -ef | grep /opt/hoge/lib/hoge-*.jar | grep -v grep | $awk_command \n\" 18 19'" 20上記コードの最終行のsendがうまくいっておりません、、、

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

なるべく対話を避ける方向に頑張った方が幸せになれるかと…。

cpでわざわざ上書き確認メッセージ出させなくてもcp -fで強制上書きできますし。
ps,grepの組み合わせの出力をawkで解釈してkillコマンドを発行する、これってpkillコマンドで一発ですよ。
sudoも、何もわざわざシェルと対話しなくてもsudo bash -c 'コマンド; コマンド'で1ライナーですむじゃないですか。あ。*の扱いにはご注意を。

…ってすると、対話が必要なのって、sudoのパスワード入れる時だけだと気付くと思います。

手元で試してみました。
エスケープに使うバックスラッシュが目減りしていく点に注意して、ですね。なお、pkillのところで、jarの間にバックスラッシュを入れているのはややdirty hackですが、pkillexpect自体を殺さないようにするためです。

#!/bin/sh ssh -t USER@HOST expect -d -c "' set timeout 60 spawn sudo bash -xc \"cp -vf hoge.jar test/; pkill -f /tmp/hoge-.\\*\\\\.j\\ar && echo killed\" expect \":\" send \"PASSWORD\n\" expect wait '"
$ ./expect.sh expect version XXXX spawn sudo bash -xc cp -vf hoge.jar test/; pkill -f /tmp/hoge-.*\.j\ar && echo killed parent: waiting for sync byte parent: telling child to go ahead parent: now unsynchronized from child spawn: returns {9121} expect: does "" (spawn_id exp6) match glob pattern ":"? no [sudo] password for USER: expect: does "[sudo] password for USER: " (spawn_id exp6) match glob pattern ":"? yes expect: set expect_out(0,string) ":" expect: set expect_out(spawn_id) "exp6" expect: set expect_out(buffer) "[sudo] password for USER:" send: sending "PASSWORD\n" to { exp6 } + cp -vf hoge.jar test/ ‘hoge.jar’ -> ‘test/hoge.jar’ + pkill -f '/tmp/hoge-.*.jar' + echo killed killed expect: read eof expect: set expect_out(spawn_id) "exp6" expect: set expect_out(buffer) " \r\n+ cp -vf hoge.jar test/\r\n\u2018hoge.jar\u2019 -> \u2018test/hoge.jar\u2019\r\n+ pkill -f '/tmp/hoge-.*.jar'\r\n+ echo killed\r\nkilled\r\n" argv[0] = expect argv[1] = -d argv[2] = -c argv[3] = set timeout 60 spawn sudo bash -xc "cp -vf hoge.jar test/; pkill -f /tmp/hoge-.\*\\.j\ar && echo killed" expect ":" send "PASSWORD\n" expect wait set argc 0 set argv0 "expect" set argv "" Connection to HOST closed.

投稿2018/08/07 13:54

編集2018/08/09 12:21
angel_p_57

総合スコア1672

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

wi2yuki

2018/08/08 03:51

ご回答ありがとうございます! 確かにおっしゃるとおりですね、、、 台風の影響で、ドタバタしているので、試すのが明日以降になりそうです、、、 申し訳ございません。 試した後、もう一度コメント差し上げます。
wi2yuki

2018/08/15 04:04

無事に動きました!!!!!!!!! ありがとうございました!!!!!!!!!!!!
guest

0

出力メッセージが不審です。
sshの先で動いているのは、シェルではないのでは?

投稿2018/08/08 03:23

otn

総合スコア84423

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

wi2yuki

2018/08/08 03:54

ありがとうございます! 確認してみます、、、
guest

0

エスケープ地獄で分けが分からなくなってるので、スクリプトを分けるかヒアドキュメントを使いましょう。

投稿2018/08/07 13:39

hichon

総合スコア5737

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

wi2yuki

2018/08/08 03:52

ご回答ありがとうございます! 確かにおっしゃるとおりですね、、、 台風の影響で、ドタバタしているので、試すのが明日以降になりそうです、、、 申し訳ございません。 試した後、もう一度コメント差し上げます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問