私は/etc/ssh/sshd_config
ファイル内の特定のパラメータの設定を自動化しようとしています。特に、
#PermitRootLogin yes
そして
#LoginGraceTime 2m
次のように読むべきです:
PermitRootLogin no
LoginGraceTime 60
私はスクリプトの専門家ではないので、ご容赦ください...
sed -e 's/#LoginGraceTime 2m/LoginGraceTime 60/' /etc/ssh/sshd_config
作業を開始しようとしましたが、奇妙な結果になりました。作業しようとしているファイルが単に cat で除外されるだけです...
誰かsedの使い方を教えてもらえませんか?
答え1
出力を一時ファイルにリダイレクトし、一時ファイルの名前を元のファイルに変更します。
sed -e 's/#LoginGraceTime 2m/LoginGraceTime 60/' /etc/ssh/sshd_config > /etc/ssh/sshd_config.tmp && mv -f /etc/ssh/sshd_config.tmp /etc/ssh/sshd_config
またはGNUをお持ちの場合は、インプレース編集のオプションsed
を使用できます。-i
sed -i -e 's/#LoginGraceTime 2m/LoginGraceTime 60/' /etc/ssh/sshd_config
答え2
@Bodo の回答と似ていますが、この解決策では元の行はそのまま残し、変更されたバージョンを元の行の下に追加します。これは、元の行をコメントとして保持する場合にのみ意味があります。
sed -i'' -n 'p;s/#\(LoginGraceTime\) 2m/\1 60/p;s/#\(PermitRootLogin\) yes/\1 no/p' /etc/ssh/sshd_config
\(...\)
ここでは、置換で に置き換えられる1 つのキャプチャ グループを使用します\1
(同じ文字列を再度入力するのが面倒なため)。
オプション付きの sed は-n
明示的に印刷された行のみを出力するため、最初のp
コマンドは変更されていない行を印刷するために使用され、次の 2 つのコマンドは変更された行を印刷するために使用されます。