Более чистый способ записи нескольких команд sed?
есть ли более сухой способ написать следующие команды (будет помещать их в скрипт оболочки bash):
sudo sed -i 's/^#PermitRootLogin yes/PermitRootLogin no/' /etc/ssh/sshd_config
sudo sed -i 's/PermitRootLogin yes/PermitRootLogin no/' /etc/ssh/sshd_config
sudo sed -i 's/^#PermitEmptyPasswords yes/PermitEmptyPasswords no/' /etc/ssh/sshd_config
sudo sed -i 's/PermitEmptyPasswords yes/PermitEmptyPasswords no/' /etc/ssh/sshd_config
sudo sed -i 's/^#PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config
sudo sed -i 's/PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config
sudo sed -i 's/^#X11Forwarding yes/X11Forwarding no/' /etc/ssh/sshd_config
sudo sed -i 's/X11Forwarding yes/X11Forwarding no/' /etc/ssh/sshd_config
8 ответов
поскольку шаблоны, которые должны быть сопоставлены, похожи, вы можете использовать чередование для 4 строк и захватить его. Сделайте #
в начале строки необязательно.
следующее объединило бы их в одно:
sed -i -r 's/^#?(PermitRootLogin|PermitEmptyPasswords|PasswordAuthentication|X11Forwarding) yes/ no/' /etc/ssh/sshd_config
если ваша версия sed
не поддерживает расширенные регулярные выражения, вы могли бы сказать:
sed -i 's/^#\{0,1\}\(PermitRootLogin\|PermitEmptyPasswords\|PasswordAuthentication\|X11Forwarding\) yes/ no/' /etc/ssh/sshd_config
либо использовать несколько -e 'sed-command'
аргументов в одном вызове sed
:
sudo sed -i.bak \
-e 's/^#PermitRootLogin yes/PermitRootLogin no/' \
-e 's/PermitRootLogin yes/PermitRootLogin no/' \
-e 's/^#PermitEmptyPasswords yes/PermitEmptyPasswords no/' \
-e 's/PermitEmptyPasswords yes/PermitEmptyPasswords no/' \
-e 's/^#PasswordAuthentication yes/PasswordAuthentication no/' \
-e 's/PasswordAuthentication yes/PasswordAuthentication no/' \
-e 's/^#X11Forwarding yes/X11Forwarding no/' \
-e 's/X11Forwarding yes/X11Forwarding no/' \
/etc/ssh/sshd_config
или создать файл скрипта sed.script
, содержащий команды:
s/^#PermitRootLogin yes/PermitRootLogin no/
s/PermitRootLogin yes/PermitRootLogin no/
s/^#PermitEmptyPasswords yes/PermitEmptyPasswords no/
s/PermitEmptyPasswords yes/PermitEmptyPasswords no/
s/^#PasswordAuthentication yes/PasswordAuthentication no/
s/PasswordAuthentication yes/PasswordAuthentication no/
s/^#X11Forwarding yes/X11Forwarding no/
s/X11Forwarding yes/X11Forwarding no/
а затем запустите sed
файл:
sudo sed -i.bak -f sed.script /etc/ssh/sshconfig
я добавил расширение резервной копии в . Вы храбрее меня, если редактируете основные конфигурационные файлы без создания резервной копии! (Это также необходимо, если вы работаете на Mac OS X или BSD;sed
там требуется расширение с -i
.)
можно использовать -e
:
sudo sed -i -e 'first_command' -e 'second command' ... -e 'last command' /etc/ssh/sshd_config
Как я уже сказал, Вы также можете использовать цикл for.
#!/bin/bash FILE='/etc/ssh/sshd_config' REPLACE_STRINGS=('s/^#PermitRootLogin yes/PermitRootLogin no/' 's/PermitRootLogin yes/PermitRootLogin no/' 's/^#PermitEmptyPasswords yes/PermitEmptyPasswords no/' 's/PermitEmptyPasswords yes/PermitEmptyPasswords no/' 's/^#PasswordAuthentication yes/PasswordAuthentication no/' 's/PasswordAuthentication yes/PasswordAuthentication no/' 's/^#X11Forwarding yes/X11Forwarding no/' 's/X11Forwarding yes/X11Forwarding no/') for i in "${REPLACE_STRINGS[@]}" { sudo sed -i "$i" $FILE }
вы можете поместить свои команды sed во внешний файл:
sudo sed -i -f commands.sed /etc/ssh/sshd_config
commands.sed:
s/#*PermitRootLogin yes/PermitRootLogin no/
s/#*PermitEmptyPasswords yes/PermitEmptyPasswords no/
s/#*PasswordAuthentication yes/PasswordAuthentication no/
s/#*X11Forwarding yes/X11Forwarding no/
вы также можете встроить многострочный скрипт sed в скрипт bash:
#!/bin/bash
sudo sed -i '
s/#*PermitRootLogin yes/PermitRootLogin no/
s/#*PermitEmptyPasswords yes/PermitEmptyPasswords no/
s/#*PasswordAuthentication yes/PasswordAuthentication no/
s/#*X11Forwarding yes/X11Forwarding no/
' /etc/ssh/sshd_config
в стандартном unix (где sed-posix, а не GNU)
sed -e 's/^#PermitRootLogin yes/PermitRootLogin no/;s/PermitRootLogin yes/PermitRootLogin no/;s/^#PermitEmptyPasswords yes/PermitEmptyPasswords no/;s/PermitEmptyPasswords yes/PermitEmptyPasswords no/;s/^#PasswordAuthentication yes/PasswordAuthentication no/;s/PasswordAuthentication yes/PasswordAuthentication no/;s/^#X11Forwarding yes/X11Forwarding no/;s/X11Forwarding yes/X11Forwarding no/' /etc/ssh/sshd_config > /tmp/sshd_config
cat /tmp/sshd_config > /etc/ssh/sshd_config
rm /etc/ssh/sshd_config
нормально это нормально, но линия когда-то определить, чтобы начать с # чем слово, а когда-то нет спецификации места так PermitRootLogin
заменить и изменить SpecialPermitRootLogin
быть ленивым, но я бы просто сделал это:
sed -Ei 's/.*PermitRootLogin yes|#PermitRootLogin no/PermitRootLogin no/g' /etc/ssh/sshd_config
sed -Ei 's/.*PermitEmptyPasswords yes|#PermitEmptyPasswords no/PermitEmptyPasswords no/g' /etc/ssh/sshd_config
sed -Ei 's/.*PasswordAuthentication yes|#PasswordAuthentication no/PasswordAuthentication no/g' /etc/ssh/sshd_config
sed -Ei 's/.*X11Forwarding yes|#X11Forwarding no/X11Forwarding no/g' /etc/ssh/sshd_config
~SimonTek
просто небольшой комментарий.
предложено красивое решение здесь (от ask Ubuntu).
вместо того, чтобы писать один и тот же символ дважды в одной строке, мы можем пересмотреть его как
sed -i '/^#PermitRootLogin/s/yes/no/' /etc/ssh/sshd_config
этот подход уменьшит ошибки, основанные на опечатках.