SSH: Jak zmienić wartość w pliku konfiguracyjnym za pomocą jednego polecenia

6

W jaki sposób można zmienić wartość, powiedzmy, PasswordAuthenticationw /etc/ssh/sshd_configpoleceń?

Również usuń # przed „kluczem”, który chcę wycenić. Nie wszystkie muszą być w jednym poleceniu. Skonfigurowałem sporo serwerów i pamiętam, gdzie wszystko się wyczerpuje, więc chcę uzyskać serię poleceń, które mogę skopiować i wkleić, i to działa dla mnie na przyszłość.

Przykładowe wartości:

PermitRootLogin no
ChallengeResponseAuthentication no
PasswordAuthentication no
UsePAM no
UseDNS no
Brian Graham
źródło

Odpowiedzi:

11

Wyrażenia regularne i sed mogą pomóc w takich rzeczach.

sed -re 's/^(PasswordAuthentication)([[:space:]]+)no/\1\2yes/' -i.`date -I` /etc/ssh/sshd_config

W moim systemie Debian nastąpi przełączenie PasswordAuthentication nona PasswordAuthentication yes, niezależnie od liczby spacji między kluczem a wartością.

Zastąpi opcję w pliku (edycja na miejscu) podczas tworzenia kopii zapasowej oryginalnego pliku z sufiksem nazwanym według daty ( sshd_config.2014-05-28).

Zmień miejsce na tak i nie, aby przełączyć się w drugą stronę.

Wyrażenie usuwania wiodącego #jest mniej więcej takie:

 sed -re 's/^(\#)(PasswordAuthentication)([[:space:]]+)(.*)/\2\3\4/' 

i wstawianie wiodącego #znaku:

 sed -re 's/^(PasswordAuthentication)([[:space:]]+)(.*)/#\1\2\3/' 

Aby przełączyć linię z opcjonalnym #znakiem -z przodu (dzięki Barlop):

sed -re 's/^(\#?)(PasswordAuthentication)([[:space:]]+)no/\2\3yes/' 

We wszystkich tych wyrażeniach możesz zmienić PasswordAuthenticationdowolną opcję, którą chcesz zmienić - prawdopodobnie nawet uczynisz ją kluczem w skrypcie powłoki i utworzysz „narzędzie przełączania opcji sshd”.

Sed i regex to cała zabawa i gry, ale jestem pewien, że Valentin ma rację, jeśli chodzi o zarządzanie konfiguracją, jeśli masz wiele systemów. Osobiście używam etckeeper / bazaar na kilku systemach, które bardzo rzadko się zmieniają - to nie jest zarządzanie konfiguracją, ale daje mi wersjonowanie, więc mogę odzyskać działającą konfigurację po tym, jak spieprzyłem regex i sed -i. :)

Kenned
źródło
Czy możesz zmodyfikować wyrażenie regularne, aby #podczas wyszukiwania zawierało znak opcjonalny , ale nie zamieniło go? Chcę usunąć znak # przed PasswordAuthentication, tylko jeśli istnieje.
Brian Graham
Hm Łatwo jest wyszukać opcjonalny znak na początku wiersza 's / ^ (\ #?) / Foo /', ale warunkowo pomiń go. Musiałbym przestudiować podręczniki sed i regex (7), co wykracza poza zakres tego. :) Możesz jednak połączyć dwa wyrażenia tutaj - najpierw usuń znak komentarza dla KLUCZ, a następnie przełącz KLUCZ na tak lub nie.
Kenned
@Kenned W wyszukiwaniu możesz przechwycić część, której szukasz, i część, której nie chcesz, i zastąpić, włączając tylko część, którą chcesz.
barlop
W przypadku, gdy trzeba przełączyć ustawienie tak / nie, można to zrobić na przykład sed '/^PasswordAuthentication /{s/yes/no/;t;s/no/yes/}' -i /etc/ssh/sshd_configi użyć go sed '/^PasswordAuthentication /{s/yes/no/;t;s/no/yes/}' -i /etc/ssh/sshd_config && grep '^PasswordAuthentication ' /etc/ssh/sshd_config && /etc/init.d/ssh reload.
PF4Public
6

Istnieje wiele opcji do wyboru:

  • Puppet, Cfengine, Chef lub dowolne inne narzędzie do zarządzania konfiguracją
  • Augeas (augtool -> print / files / etc / ssh / sshd_config -> następnie użyj „set”)
  • sed -i
  • i wiele więcej

Po próbie odgadnięcia, dokąd chcesz się udać, prawdopodobnie i tak warto rozważyć użycie zarządzania konfiguracją.

Valentin
źródło
Czy możesz podać mi przykład, używając sed?
Brian Graham
+1 za podanie 3 możliwych rozwiązań. I @BrianGraham err brian naprawdę nie jest trudno dowiedzieć się, jak przeprowadzić wyszukiwanie i zastąpić sed. sed -i 's / a / b /' aa (zamienia „a” na „b” w pliku „a.a”. Bardziej skomplikowane z wyrażeniem regularnym, ale wtedy twoje pytanie brzmi, jak zrobić wyrażenie regularne, zamiast sed lub ssh
barlop
4

Augeas z narzędziem wiersza poleceń - augtool - może konfigurować/etc/ssh/sshd_config. Na przykład:

augtool --autosave 'set /files/etc/ssh/sshd_config/PasswordAuthentication yes'

Aby ustawić wszystkie wartości, użyj:

SSHD_UsePAM=no
SSHD_UseDNS=no
augtool << EOF
set /files/etc/ssh/sshd_config/PermitRootLogin no
set /files/etc/ssh/sshd_config/ChallengeResponseAuthentication no
set /files/etc/ssh/sshd_config/PasswordAuthentication no
set /files/etc/ssh/sshd_config/UsePAM ${SSHD_UsePAM}
set /files/etc/ssh/sshd_config/UseDNS ${SSHD_UseDNS}
save
EOF
Cristian Ciupitu
źródło
Tylko uwaga: to nie zadziała, jeśli w pliku znajdują się bloki dopasowania, ponieważ parametry globalne będą musiały zostać wstawione przed pierwszym blokiem dopasowania.
ℝaphink
@ ℝaphink, czy nie dotyczy to również wszystkich innych odpowiedzi? Czy możesz również wkleić taki plik konfiguracyjny?
Cristian Ciupitu
To prawda. Wyślę odpowiedź za pomocą Puppet + augeasproviders.
ℝaphink
1

sshd_confignie można go bezpiecznie edytować bez całkowitego przeanalizowania, ponieważ może zawierać Matchbloki.

Augeas to dobra opcja, aby to osiągnąć, ale nie jest łatwo zarządzać wstawianiem opcji we właściwym miejscu, gdy są Matchjuż bloki. Jedną z opcji jest użycie Puppet z sshd_configdostawcą z siedzibą w Augeas :

sshd_config { "PermitRootLogin":
  ensure => present,
  value  => "yes",
}

Ta opcja ma tę zaletę, że używa ścisłego parsera (Augeas z Sshd.lnssoczewką) i poziomu abstrakcji (zasób marionetek), który zarządza złożonością ustawiania parametrów poza Matchblokami, ale także wewnątrz nich:

sshd_config { "X11Forwarding":
  ensure    => present,
  condition => "Host foo User root",
  value     => "yes",
}
Inkaphink
źródło
Czy mógłbyś sprawdzić, czy można ustawić globalny PasswordAuthenticationaby now tosshd_config ?
Cristian Ciupitu
1
Tak, mogę to potwierdzić, właśnie to zrobiłem.
ℝaphink