2011-08-13 9 views
1

最近別のユーザーとして殺しますここで起動スクリプトがあり、それだけで正常に動作します...Linuxのシェルスクリプトが、私はこのスクリプトの作業を取得しようとしてきた

#!/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を使用」に 感謝を私に教えないでください!

+0

なぜ 'nohupをkill'? 'kill'コマンドは簡単です。 –

+0

また、 '[lrange $ argv 0 0]'の代わりに '' [lindex $ argv 0] 'を使ってください(余分な引用符を本当に必要としない限り、おそらくリストの重要な文字がパスワードに含まれていません! –

答えて

0

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

0

本当の問題は、あなたのコードがその(かなり複雑な)コマンドから出てくるエラーメッセージを削除していることです。その情報をすぐに印刷したり、ファイルに記録したりする方がはるかに良いでしょう。そのように、あなたは野生の推測をする必要がなく、問題を診断することができます...

他にも問題があります。

  • あなたはnohupkillを包むが、信号を送信することはほとんど瞬間的であり、あなたが余分な複雑さを望んでいないとして、それは本当に不要です。
  • パスワードをコマンドライン引数として渡しています。 すべてのプロセスは、どのプログラムにも渡されたコマンドライン全体を読み取ることができるので、安全ではありません。コマンドラインで指定されたファイルからパスワードを取得する方が良いでしょう。アクセス権を正しく設定すると、あなた(そしてroot)だけがパスワードを読むことができます(これはOKです)。
  • コマンドライン引数を抽出するときは、lrangeを使用します。それは...確かに間違っています(lindexコマンドが良い選択です。あるいは、Tcl 8.5以降で実行されている場合は、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} 
関連する問題