Hacer coincidir una lista de usuarios con /etc/passwd

Hacer coincidir una lista de usuarios con /etc/passwd

Tengo una lista simple de usuarios de una columna. Proviene del comando lastlog. Necesito poder saber si estas cuentas están deshabilitadas y no tengo acceso de root. Solo puedo ver con más y ejecutar el comando lastlog. Necesito ver si los usuarios que no iniciaron sesión en los últimos 90 días siguen activos.

Hasta ahora ejecuto

sudo lastlog -b 90

Lo que me da los usuarios que iniciaron sesión... en los últimos 90 días. Ahora simplemente lo ejecuto awk imprimiendo el primer campo y esa es mi lista de usuarios simple. Ahora me gustaría básicamente ver si en /etc/passwd, su shell es /bin/bash y si en /etc/shadow, hay un !en su línea. Cómo puedo hacer esto. Probé los bucles for y while y parece que no puedo hacerlo bien. Cualquier ayuda sería apreciada.

Respuesta1

No estoy seguro de haberte entendido correctamente. ¿Es eso lo que buscas?

lastlog -b 90 | awk '{if (NR > 1) print $1 }' | grep -f - /etc/passwd | grep "/bin/bash$"

Aquí está el desglose:

  • awk '{if (NR > 1) print $1 }'- imprime la primera columna omitiendo la primera línea (encabezado del último registro)
  • grep -f - /etc/passwd- utilizar la entrada estándar como un archivo para obtener patrones y buscar patrones en/etc/passwd
  • grep "/bin/bash$"- grep para /bin/bash, $significa EOL.

Algunas notas:

  • lastlog -b 90- eso te da registrosmás viejode 90 días. Si desea que los usuarios que iniciaron sesión dentro de los últimos 90 días utilicen lastlog -t 90.
  • Solo opté por (NR > 1)la solución porque la estamos usando awkde todos modos. Una forma más concisa de omitir la primera línea de un archivo sería sed 1d.

EDITAR

Puede utilizar un modismo similar si también desea filtrar los registros desde !/etc/shadow. Entonces el comando completo sería:

lastlog -b 90 | awk '{if (NR > 1) print $1 }' | grep -f - /etc/passwd | grep "/bin/bash$" | cut -d ':' -f 1 | grep -f - /etc/shadow | grep -v ":\!:"
  • cut -d':' -f 1divide la línea usando :como delimitador y devuelve el primer campo
  • grep -vmediocoincidencia invertida(seleccione líneas que no coincidan).

Respuesta2

El signo de exclamación, como habrás notado, debe "eliminarse". Intente ingresar búsquedas con una barra invertida primero: \! en lugar de ! por lo que no lo ejecuta como un comando en lugar de ser tratado como texto. En muchos casos, también puedes citarlo con comillas simples (no dobles) como esta: '!' -- dependiendo del comando que elijas, uno de ellos debería hacerlo por ti.

información relacionada