1

最近、私はこのスクリプトを機能させようとしています:

#!/usr/bin/expect -f
set pssword [lrange $argv 0 0]
spawn su - kod -c cd cod4 -c "nohup kill 7938"  > /dev/null 2>&1 &
expect "Password:" { send "$pssword\r" }
expect "# " { send "q" }
exit

「kod」というユーザーとしてログインし、特定のpidでプロセスを強制終了する必要があります

これが開始スクリプトで、問題なく動作します...

#!/usr/bin/expect -f
set pssword [lrange $argv 0 0]
set port [lrange $argv 1 1]
set mod [lrange $argv 2 2]
set map [lrange $argv 3 3]
set num [lrange $argv 4 4]
set hostname [lrange $argv 5 5]
set rcon [lrange $argv 6 6]
set password [lrange $argv 7 7]
spawn su - kod -c cd cod4 -c "nohup ./cod4_lnxded +set s_num=$num +set net_port $port +set dedicated 2 +set fs_game mods/$mod +set sv_punkbuster 1 +set sv_hostname $hostname +set rcon_password $rcon +set g_password $password +set promod_mode match_mr10 +set g_gametype sd +map $map"  > /dev/null 2>&1 &
expect "Password:" { send "$pssword\r" }
expect "# " { send "q" }
exit

「root としてログイン」または「sudo を使用するだけ」とは言わないでください。そうではないので... ありがとう !

4

2 に答える 2

0

プロセスを実行したユーザーとそれを強制終了したいユーザーは、共通のグループに属すべきだと思います。プロセス許可もそのグループに関連付ける必要があります。

于 2011-08-13T11:20:45.713 に答える
0

本当の問題は、コードがその (かなり複雑な) コマンドから出てくる可能性のあるエラー メッセージを削除していることです。その情報をすぐに印刷するか、ファイルに記録する方がはるかに良いでしょう。このように、大雑把な推測をせずに問題を診断できます…</p>

他にも問題があります。

  • でラップしますkillnohup、信号の送信はほぼ瞬時に行われ、余分な複雑さを望まないため、これは本当に不要です。
  • コマンドライン引数としてパスワードを渡しています。どのプロセスも、任意のプログラムに渡されたコマンド ライン全体を読み取ることができるため、これは安全ではありません。コマンド ラインで指定したファイルからパスワードを取得することをお勧めします。パーミッションを正しく設定すれば、あなた (および root) だけがパスワードを読み取ることができます (これで問題ありません)。
  • lrangeコマンドライン引数を抽出するときに使用します。それは…ほぼ確実に間違っています ( Tcl 8.5 以降で実行されている場合、lindexコマンドはより良い選択であり、おそらく一度に多くの値を抽出することさえできます)。lassign
  • プロセス ID をハードコーディングしています。時間の経過とともに変化する可能性が非常に高いため、これはほぼ間違いなくあなたがやりたいことではありません。

その小さなロットを並べ替えると、次の改善されたスクリプトが得られます。

#!/usr/bin/expect -f

# A more robust method for handling arguments than you had...
if {$argc == 0} {
    error "usage: $argv0 pid ?passFile?"
}
set pid [lindex $argv 0]
if {$argc > 1} {
    set passwordFile [lindex $argv 1]
} else {
    # Sensible default
    set passwordFile ~/.codPassword
}

# Read the password from the file
set f [open $passwordFile]
gets $f pssword
close $f

# Run the program (doesn't need the 'cd') with trap to supply password,
# and connect to user for error passthrough
spawn su - kod -c kill $pid
expect_background {
    "Password:" {exp_send "$pssword\r"}
}
interact {eof close}

これについてさらに考えてみると、質問が提起されてから長い時間が経ちましたが、もう1つの問題は次のとおりです。

spawn su - kod -c cd cod4 -c "nohup kill 7938"  > /dev/null 2>&1 &

それは奇妙で予期しないことをしている可能性が非常に高いです。代わりに、おそらくこれが必要です。

spawn su -c "cd cod4; nohup kill 7938 > /dev/null 2>&1 &" - kod

これは、実行するシェル内で実行する単一のシェル スクリプトとしてすべてを渡す必要があるためですsu

于 2011-09-27T08:52:38.957 に答える