Скрипт Linux Shell, убей другого пользователя - PullRequest
1 голос
/ 13 августа 2011

Недавно я пытался заставить этот скрипт работать:

#!/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", потому что это не так ... Спасибо!

Ответы [ 2 ]

0 голосов
/ 27 сентября 2011

Настоящая проблема в том, что ваш код отбрасывает любые сообщения об ошибках, которые могут появиться из этой (довольно сложной) команды; было бы гораздо лучше, если бы вы немедленно распечатали эту информацию или занесли ее в файл. Таким образом, вы можете диагностировать проблемы, а не делать предположения ...

Есть и другие проблемы.

  • Вы заключаете kill в nohup, но это действительно не нужно, поскольку отправка сигнала почти мгновенная, и вам не нужны дополнительные сложности.
  • Вы передаете пароли в качестве аргументов командной строки. Это небезопасно, потому что любой процесс может прочитать всю командную строку, переданную любой программе. Лучше извлечь пароль из файла, имя которого указано в командной строке; тогда только вы (и пользователь root) могут прочитать пароль (что в порядке), если вы установите права доступа правильно.
  • Вы используете lrange при извлечении аргументов командной строки; это ... почти наверняка неправильно (команда lindex является лучшим выбором, или, возможно, даже lassign для извлечения многих значений одновременно, при условии, что она работает в Tcl 8.5 или более поздней версии).
  • Вы жестко программируете идентификатор процесса. Это почти наверняка не то, что вы хотите сделать, поскольку вполне вероятно, что со временем все изменится.

Перебирая этот маленький участок, я получаю этот улучшенный сценарий:

#!/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}
0 голосов
/ 13 августа 2011

Я думаю, что пользователь, который запустил процесс, и пользователь, который хочет его убить, должны быть в общей группе.Разрешение процесса также должно быть связано с этой группой.

...