2016-10-24 3 views
-1

Я написал сценарий ожидания, чтобы создать пользователя на сервере unix. Это в основном подключается через SSH к серверу с помощью моего верительных и су укоренить сделать useradd и т.д. (я понимаю, что есть другие методы, чтобы сделать то же самое, но я ограничен такими параметрами и окружающей среды в настоящее время.)Ожидайте скрипта, если пользователь существует до создания

set prompt "(%|#|>|\\\$)" 
set prompt [string trim $prompt] 

spawn ssh -o StrictHostKeyChecking=no -l $my_user $hostname 

expect "?assword: " 
send "$my_pass\r" 
expect -re $prompt 
send "/usr/bin/su - \r" 
expect "?assword: " 
send "$root_pass\r" 
expect -re $prompt 
send "/usr/sbin/useradd -d /export/home/$user -m -s /bin/sh $user \r" 
expect -re $prompt 
send "/usr/bin/passwd $user \r" 
expect "?assword:" 
send "$new_pass\r" 
expect "?assword:" 
send "$new_pass\r" 
send "exit\r" 
expect -re $prompt 
send "exit\r" 
expect -re $prompt 

Однако, если я застрял в добавлении логики, чтобы проверить, существует ли пользователь в системе. Если бы это было в bash, я бы добавил grep -c '^USER' /etc/passwd, чтобы проверить возвращаемый номер. Но я не могу зафиксировать возвращаемый номер из ожидаемого. Слишком много информации возвращено после того, как я добавил:

send "egrep -c '^$user' /etc/passwd \r" 
set output $expect_out(buffer) 

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

ответ

0

Если предположить, что оболочка на удаленном хосте ш основе, а удаленная система Linux:

set cmd [format {getent passwd %s >/dev/null 2>&1; [ "$?" -eq 2 ] && /usr/sbin/useradd -d /export/home/%s -m -s /bin/sh %s} $user $user $user] 
send "$cmd\r" 

Я использую format (известный как sprintf на других языках), чтобы облегчить цитирование.

+0

спасибо. Удаленный хост, который у меня есть, находится на Solaris. Однако я смог найти решение. – Ben

0

Проведя еще несколько часов, изучая tcl, это работает сейчас.

Я заменяю этот блок кода после ввода root_pass.

send "\r" 
    expect -re $prompt 
    expect *; 
    send "egrep -c '^$user:' /etc/passwd \r" 
    expect -re $prompt 
    set output $expect_out(buffer); 
    set ans [ split $output \n ] 
    set var [lindex $ans 1] 
    if { $var >= 1 } { 
     puts "Found.\r" 
     send "exit\r" 
     expect eof 
    } else { 
     puts "Not found.\r" 
     send "/usr/sbin/useradd -d /export/home/$user -m -s /bin/sh $user \r" 
     ..... 
    } 
Смежные вопросы