2014-04-29 27 views
11

aşağıdaki komutları yazmak için daha KURU yolu var mı (bir bash kabuk komut koyarak edilecektir):Birden çok sed komutu yazmanın daha temiz bir yolu var mı?

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 
+1

Evet. değişkenler: p – keyser

+0

Ve dosyalar. Ve sed eşleme ifadeleri kullanarak. "Adam Sed" yi dene. –

+0

aynı zamanda her zaman aynı dosyaya eriştiğiniz için for döngüsü ve liste kullanabilirsiniz. Liste, tüm farklı değiştirme dizelerinizi içerecektir. – dboals

cevap

12

desenler eşleştirilecek yana benzer, 4 dizeleri için dönüşümden yararlanabilir ve onu yakalayabilirsiniz. İsteğe bağlı dizenin başında # yapın.

birine olanlar birleştirmek istiyorsunuz şu:

sed -i -r 's/^#?(PermitRootLogin|PermitEmptyPasswords|PasswordAuthentication|X11Forwarding) yes/\1 no/' /etc/ssh/sshd_config 

sed sürümünüz genişletilmiş düzenli ifadeler desteklemiyorsa, diyebilirsiniz:

sed -i 's/^#\{0,1\}\(PermitRootLogin\|PermitEmptyPasswords\|PasswordAuthentication\|X11Forwarding\) yes/\1 no/' /etc/ssh/sshd_config 
+0

@keyser -r '' '' olmadan ve parantez özel olmaz, yani bunlardan kurtulmanız gerekir. – devnull

+0

Anladım, teşekkürler. Benim sedim yoktu: p – keyser

+1

@keyser -r 'olmadan bir varyant eklendi. – devnull

3

Sen -e kullanabilirsiniz:

sudo sed -i -e 'first_command' -e 'second command' ... -e 'last command' /etc/ssh/sshd_config 
+1

+1 İyi cevabınızı geri almak için oy verildi. –

3

seni Dediğim gibi bir for döngüsü de kullanabilir. sed tek çağırma

 
#!/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 
} 
+0

Onun lehine olan tek şey işe yaramıyor olmasıdır. Aksi halde tavsiye edilemez. –

+0

Cevabınızdaki birkaç şeyi düzeltmek için özgürlüğü aldım. İtirazınız varsa geri dönebilirsiniz. – devnull

+0

Bu, tek bir “sed” çağrısının kullanılmasından daha düşüktür. – tripleee

10

Ya kullanım birden -e 'sed-command' argümanlar:

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 

Veya bir komut dosyası, sed.script oluşturmak, komutlar içeren:

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/ 

ve daha sonra sed çalıştırmak bu dosya:

sudo sed -i.bak -f sed.script /etc/ssh/sshconfig 

-i seçeneğine bir yedekleme uzantısı ekledim. Büyük yapılandırma dosyalarını önce bir yedek kopya yapmadan düzenlerseniz daha cesur bir adamsın! (Mac OS X veya BSD üzerinde çalışmak durumunda da gerekli; sed-i sahip uzantıları var gerektirir.)

+1

'# \?' Komutunu kullanarak komut sayısını yarıya bölebilir veya eğer 'sed' lehçeniz bunu desteklemiyorsa, belki' # * '. – tripleee

+0

@tripleee: Evet, '^ # \ {0,1 \} kullanımı da dahil olmak üzere, normal ifadeleri gözden geçirmenin yolları vardır, ancak bazen insanların daha kolay, daha ayrıntılı bir şekilde yedek komutları yazmasına izin vermek daha kolaydır. Bu onlar için daha güvenilir bir betiğe yol açar. Daha karmaşık ifadelerle daha rahat hale geldikçe, komut dosyasının içeriğini azaltabilirler. Ancak, “sed” nin komut dosyalarında veya çoklu '-e' argümanlarında (ya da tek bir çoklu çizgi' -e' argümanı ile) çalışabileceğini bilmek, buradaki önemli bilgilerdir. –

+0

Evet, doğru. Merak ediyorum @fedorqui '-e' kullanarak cevabı silmek için neden seçti. – devnull

1

Harici dosyada sed komutları koyabilirsiniz: Ayrıca gömebilirsiniz

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/ 

bir bash komut bir çok satırlı sed komut dosyası:

#!/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 
0

standart unix üzerinde

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 
(sed nereye posix olup GNU olan)

normalde tamam ama hat bazen öylesine bir PermitRootLogin yedek da değişir kelime yerine # ve yerin bazen hiç şartnameye başlamak için tanımladığınız SpecialPermitRootLogin

0

tembel olmak, ama sadece bu yapardı:

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

0

Sadece küçük bir yorum.

Güzel çözüm önerisi here (from ask Ubuntu) önerilir.

yerine tek bir satırda iki kez aynı karakteri yazma, biz

sed -i '/^#PermitRootLogin/s/yes/no/' /etc/ssh/sshd_config 

olarak yazım hatalarını dayalı hatalar azaltacaktır Bu yaklaşım bunu düzeltebilirsiniz.

İlgili konular