teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

サンプルを追加

2018/08/09 12:21

投稿

angel_p_57
angel_p_57

スコア1681

answer CHANGED
@@ -4,4 +4,59 @@
4
4
  `ps`,`grep`の組み合わせの出力を`awk`で解釈して`kill`コマンドを発行する、これって`pkill`コマンドで一発ですよ。
5
5
  `sudo`も、何もわざわざシェルと対話しなくても`sudo bash -c 'コマンド; コマンド'`で1ライナーですむじゃないですか。あ。`*`の扱いにはご注意を。
6
6
 
7
- …ってすると、対話が必要なのって、`sudo`のパスワード入れる時だけだと気付くと思います。
7
+ …ってすると、対話が必要なのって、`sudo`のパスワード入れる時だけだと気付くと思います。
8
+
9
+ 手元で試してみました。
10
+ エスケープに使うバックスラッシュが目減りしていく点に注意して、ですね。なお、`pkill`のところで、`jar`の間にバックスラッシュを入れているのはややdirty hackですが、`pkill`が`expect`自体を殺さないようにするためです。
11
+
12
+ ```スクリプト
13
+ #!/bin/sh
14
+
15
+ ssh -t USER@HOST expect -d -c "'
16
+ set timeout 60
17
+ spawn sudo bash -xc \"cp -vf hoge.jar test/; pkill -f /tmp/hoge-.\\*\\\\.j\\ar && echo killed\"
18
+ expect \":\"
19
+ send \"PASSWORD\n\"
20
+ expect
21
+ wait
22
+ '"
23
+ ```
24
+
25
+ ```実行結果
26
+ $ ./expect.sh
27
+ expect version XXXX
28
+ spawn sudo bash -xc cp -vf hoge.jar test/; pkill -f /tmp/hoge-.*\.j\ar && echo killed
29
+ parent: waiting for sync byte
30
+ parent: telling child to go ahead
31
+ parent: now unsynchronized from child
32
+ spawn: returns {9121}
33
+
34
+ expect: does "" (spawn_id exp6) match glob pattern ":"? no
35
+ [sudo] password for USER:
36
+ expect: does "[sudo] password for USER: " (spawn_id exp6) match glob pattern ":"? yes
37
+ expect: set expect_out(0,string) ":"
38
+ expect: set expect_out(spawn_id) "exp6"
39
+ expect: set expect_out(buffer) "[sudo] password for USER:"
40
+ send: sending "PASSWORD\n" to { exp6 }
41
+
42
+ + cp -vf hoge.jar test/
43
+ ‘hoge.jar’ -> ‘test/hoge.jar’
44
+ + pkill -f '/tmp/hoge-.*.jar'
45
+ + echo killed
46
+ killed
47
+ expect: read eof
48
+ expect: set expect_out(spawn_id) "exp6"
49
+ 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"
50
+ argv[0] = expect argv[1] = -d argv[2] = -c argv[3] =
51
+ set timeout 60
52
+ spawn sudo bash -xc "cp -vf hoge.jar test/; pkill -f /tmp/hoge-.\*\\.j\ar && echo killed"
53
+ expect ":"
54
+ send "PASSWORD\n"
55
+ expect
56
+ wait
57
+
58
+ set argc 0
59
+ set argv0 "expect"
60
+ set argv ""
61
+ Connection to HOST closed.
62
+ ```