2015-06-28 2 views
2

Я простой скрипт, чтобы установить несколько параметров в/и т.д./SSH/sshd_config:расширения переменной в качестве шаблона в СЭД не работает

#! /bin/bash 

declare -a param=('Banner' 'ClientAliveInterval' 'ClientAliveCountMax' 'Ciphers' \ 
'PermitUserEnvironment' 'PermitEmptyPasswords' 'PermitRootLogin' \ 
'HostbasedAuthentication' 'IgnoreRhosts' 'MaxAuthTries' \ 
'X11Forwarding' 'LogLevel'\ 
) 

declare -a val=('/etc/issue.net' '300' '0' 'aes128-ctr,aes192-ctr,aes256-ctr' \ 
'no' 'no' 'no' 'no' 'yes' '4' 'no' 'INFO' \ 
) 

for ((i=0;i<12;i++)) 
do 
#echo "${param[$i]} ${val[$i]}" 
    egrep "^[ #]*${param[$i]}.*" /etc/ssh/sshd_config &> /dev/null 
    if [ $? -eq 0 ]; 
    then 
     sed -i "s|^[ #]*\$param[$i].*|${param[$i]} ${val[$i]}|1" /etc/ssh/sshd_config 
    else 
     echo "${param[$i]} ${val[$i]}" >> /etc/ssh/sshd_config 
    fi 
done; 

Однако переменная расширения в SED матче шаблон не работает как хотелось бы :

sed -i "s|^[ #]*\$param[$i].*|${param[$i]} ${val[$i]}|1" /etc/ssh/sshd_config 

Может кто-нибудь мне помочь. Мое расширение массива и все в скрипте все же в порядке. Я проверил то же самое с распечаткой echo.

ответ

1

Не знаете, почему у вас есть $ экранированный, и для доступа к элементу массива вам необходимо использовать ${param[$i]}.

Вы можете использовать:

sed -i "s~^[ #]*${param[$i]}.*~${param[$i]} ${val[$i]}~1" /etc/ssh/sshd_config 

кстати ^[ #]* будет соответствовать только пространство или # в начале строки.

+0

Отлично .. Спасибо, это работает. Однако еще один запрос, чтобы я понял это правильно. Основным синтаксисом 'sed' для поиска и замены будет:' sed 's/pattern/change_to/g' file'. Но в вашем ответе я вижу вместо этого '~'. Более того, это 's ~'. Не могли бы вы немного объяснить это. Спасибо заранее. –

+0

Я использовал '~', так как 'sed' разрешает любой символ как разделитель регулярных выражений и' ~ 'не был замечен в вашем тексте поиска. – anubhava

+1

Теперь я сомневаюсь. большое спасибо –