Estoy tratando de encontrar y reemplazar una cadena específica dentro de /etc/ssh/sshd_config.
#PermitRootLogin yes > PermitRootLogin no . Sin embargo, quiero asegurarme de obtener casi cualquier versión (si eso tiene sentido).
ex;
#PermitRootLogin yes PermitRootLogin yes #PermitRootLogin noSoy bastante nuevo en bash, linux, unix, etc. y realmente solo he estado aprendiendo estas cosas durante las últimas 2 semanas, así que si es posible, explícame como si fuera nuevo en linux/unix. Gracias de antemano.
Hasta ahora he probado 2 cosas hasta ahora y ninguno de ellos parece hacer lo que necesito.
sed -E 's/(#|^)PermitRootLogin(yes|no)/PermitRootLogin no/' FILENAMEy
sed -E 's/(#/|^/)PermitRootlogin(yes/|no/)/PermitRootLogin no/' FILENAMEEsperaba que todas las líneas del ejemplo anterior se cambiaran a;
PermitRootLogin no PermitRootLogin no PermitRootLogin noA este solo le falta un espacio
sed -E 's/(#|^)PermitRootLogin(yes|no)/PermitRootLogin no/' FILENAME # ............................^Yo sugeriría
sed -E '/PermitRootLogin/ s/.*/PermitRootLogin no/' FILENAMElo que significa: para cualquier línea que contenga la cadena "PermitRootLogin", reemplace la línea completa con "PermitRootLogin no"
Éste
sed -E 's/(#/|^/)PermitRootlogin(yes/|no/)/PermitRootLogin no/' FILENAME muestra un poco de malentendido del papel del carácter / en sed.
/ no es un carácter regex, es el delimitador del comando s para separar la expresión regular, el texto de reemplazo y las banderas. Ver 3.3 El Comando s en el manual sed.
Con sus muestras mostradas, intente seguir el código awk .
awk '/^#?PermitRootLogin/{print "PermitRootLogin no"}' Input_file Explicación: la explicación simple sería verificar la condición si la línea comienza con # (manteniéndolo opcional) seguido de PermitRootLogin y luego usar la impresión PermitRootLogin seguido de no según el requisito.
NOTA: En caso de que desee guardar los cambios en el mismo archivo de entrada, ejecute lo siguiente: awk '/^#?PermitRootLogin/{print "PermitRootLogin no""}' Input_file > temp && mv temp Input_file
Puedes usar este sed :
sed -E 's/^#?(PermitRootLogin) +.*/\1 no/' file PermitRootLogin no PermitRootLogin no PermitRootLogin noDonde el archivo de entrada es así:
cat file #PermitRootLogin yes PermitRootLogin yes #PermitRootLogin noExplicación:
^ : Inicio#? : Coincide con un # opcional(PermitRootLogin) + : Haga coincidir PermitRootLogin y capture en el primer grupo seguido de 1+ espacio.* : Coincide con cualquier cosa hasta el final de la línea/\1 no/ : Sección de reemplazo para poner el valor del grupo de captura #1 seguido de espacio y noPara guardar el cambio en línea en el uso del archivo:
sed -i.bak -E 's/^#?(PermitRootLogin) +.*/\1 no/' file