A veces, sus scripts deben comportarse de manera diferente en diferentes Linux. ¿Cómo puedo determinar en qué versión de Linux se ejecuta un script?
A veces, sus scripts deben comportarse de manera diferente en diferentes Linux. ¿Cómo puedo determinar en qué versión de Linux se ejecuta un script?
Respuestas:
No intente hacer suposiciones basadas en la distribución en cuanto a lo que puede y no puede hacer, ya que de ese modo se encuentra la locura (consulte también "Detección de agente de usuario"). En su lugar, detecta si lo que quieres hacer es compatible y cómo lo hace cualquier comando o ubicación de archivo que quieras usar.
Por ejemplo, si desea instalar un paquete, puede detectar si está en un sistema similar a Debian o un sistema similar a RedHat verificando la existencia de dpkg o rpm (compruebe primero dpkg, porque las máquinas Debian pueden tener el comando rpm en ellos ...). Tome su decisión sobre qué hacer basándose en eso, no solo en si es un sistema Debian o RedHat. De esta forma, admitirá automáticamente cualquier distribución derivada que no haya programado explícitamente. Ah, y si su paquete requiere dependencias específicas, pruebe también esas y deje que el usuario sepa lo que falta.
Otro ejemplo es jugar con las interfaces de red. Determine qué hacer en función de si hay un archivo / etc / network / interfaces o un directorio / etc / sysconfig / network-scripts, y vaya desde allí.
Sí, es más trabajo, pero a menos que desee rehacer todos los errores que los desarrolladores web han cometido en la última década o más, lo hará de manera inteligente desde el principio.
No hay forma de distribución cruzada. Sin embargo:
- Redhat y amigos: prueba
/etc/redhat-release
, verifica el contenido- Debian: prueba
/etc/debian_version
, verifica el contenido- Mandriva y sus amigos: prueba para
/etc/version
verificar el contenido- Slackware: prueba
/etc/slackware-version
, verifica el contenido
Etc. En términos generales, verifique /etc/*-release
y /etc/*-version
.
Editar: Encontré un viejo script de bash mío (1+ años) por ahí que debo haber improvisado a lo largo de los años (tiene un impresionante registro de CVS que data de hace 6 años). Puede que ya no funcione correctamente tal como está y puedo No se moleste en encontrar distribuciones instaladas para probar, pero debería proporcionarle un buen punto de partida. Funciona bien en CentOS, Fedora y Gentoo. gyaresu lo probó con éxito en Debian Lenny.
#!/bin/bash
get_distribution_type()
{
local dtype
# Assume unknown
dtype="unknown"
# First test against Fedora / RHEL / CentOS / generic Redhat derivative
if [ -r /etc/rc.d/init.d/functions ]; then
source /etc/rc.d/init.d/functions
[ zz`type -t passed 2>/dev/null` == "zzfunction" ] && dtype="redhat"
# Then test against SUSE (must be after Redhat,
# I've seen rc.status on Ubuntu I think? TODO: Recheck that)
elif [ -r /etc/rc.status ]; then
source /etc/rc.status
[ zz`type -t rc_reset 2>/dev/null` == "zzfunction" ] && dtype="suse"
# Then test against Debian, Ubuntu and friends
elif [ -r /lib/lsb/init-functions ]; then
source /lib/lsb/init-functions
[ zz`type -t log_begin_msg 2>/dev/null` == "zzfunction" ] && dtype="debian"
# Then test against Gentoo
elif [ -r /etc/init.d/functions.sh ]; then
source /etc/init.d/functions.sh
[ zz`type -t ebegin 2>/dev/null` == "zzfunction" ] && dtype="gentoo"
# For Slackware we currently just test if /etc/slackware-version exists
# and isn't empty (TODO: Find a better way :)
elif [ -s /etc/slackware-version ]; then
dtype="slackware"
fi
echo $dtype
}
Tenga en cuenta que esto probablemente solo funcionará correctamente en Bash. Podrías reescribirlo para otros proyectiles.
Dicho esto, es posible que desee probar las características, no las distribuciones. Ya no estoy usando esto simplemente porque se convirtió en una carga de mantenimiento. Es más fácil confiar en herramientas y soluciones de distribución cruzada.
Conceptualmente, lo que hace es, en orden:
- Extraiga un tipo de archivo conocido, "función de secuencia de comandos de inicio común". Esos son específicos de distribución. Si no existe, pase a la siguiente verificación de distribución.
- Verifique la existencia de una función específica, conocida por existir, de uso frecuente y poco probable que cambie de nombre a partir de ese script central. Hacemos eso usando el
type
Bash incorporado.type -t
devuelvefunction
si ese símbolo es una función. Anteponemoszz
la salida detype -t 2>/dev/null
porque si el nombre no está definido, la cadena de salida estaría vacía y obtendríamos un error de sintaxis sobre una mano izquierda faltante para el==
operador. Si el nombre que acabamos de verificar no es una función, salte a la siguiente verificación de distribución, de lo contrario, encontramos el tipo de distribución.- Finalmente, repita el tipo de distribución para que la salida de la función se pueda usar fácilmente en un caso ... ese bloque.
Edite en caso de que esté tratando de ejecutar esto como un script directo: se supone que este script debe obtenerse o incluirse de otros scripts. No genera nada por sí solo si lo ejecuta tal cual. Para probarlo, búsquelo y luego invoque la función, por ejemplo:
source /path/to/this/script.sh
get_distribution_type
en el indicador de bash.
Editar: tenga en cuenta que este script no requiere privilegios de root. Te insto a que no lo ejecutes como root. No debería dañar nada, pero no hay necesidad.
Encontré un enlace a una publicación de lista de correo relevante en el registro de CVS. Debería ser útil para desenvolver los espaguetis de script de inicio.
Puede encontrar la versión del kernel ejecutando uname -a
, encontrar la versión de distribución depende de la distribución.
En Ubuntu y otros sistemas operativos, puede ejecutar lsb_release -a
o leer / etc / lsb_release
Debian almacena la versión en / etc / debian_version
La mayoría de las distribuciones tienen un método único para determinar la distribución particular.
Por ejemplo:
Redhat (And derivatives): /etc/redhat-release
SUSE: /etc/SUSE-release
Existe un estándar conocido como Linux Standard Base o LSB . Define que debe haber un archivo llamado / etc / lsb-release o un programa llamado lsb_release que hará eco de la información sobre su distribución de Linux.
lsb_release -a
lsb_release
no existe en CentOS 6.
python -c 'import platform ; print platform.dist()[0]'
código: http://hg.python.org/cpython/file/2.7/Lib/platform.py
python -c 'import platform; print(platform.dist()[0])'
, porque de esa manera también funciona si el pitón normal predeterminado es python3.
Además de las otras respuestas: si solo desea analizar un archivo, la mayoría de las distribuciones personalizan el inicio de sesión de tty a través de / etc / issue, por ejemplo:
Bienvenido a SUSE Linux Enterprise Server 10 SP2 (i586) - Kernel \ r (\ l).
Y sí, sé que es subóptimo. :)
Todo lo que necesita hacer es escribir uname -a
en su shell favorito. Eso imprimirá el nombre y la versión del núcleo.
Estoy de acuerdo con Mark, Adam y Mihai (no puedo votar debido a una reputación insuficiente). Las soluciones basadas en LSB y su relativa FHS funcionarán con la mayoría de las distribuciones y es probable que continúen funcionando en el futuro. LSB y FHS son tus amigos.
La versión de Linux es una pregunta difícil. Si lo miramos de forma limitada, tenemos la versión del núcleo que puede obtener con " uname -r
". La versión de distribución es principalmente irrelevante. Algunas distribuciones son mejores (distribuciones empresariales como Redhat Enterprise Linux). Otras distribuciones como Gentoo son básicamente objetivos móviles que no tienen una versión sensible. Si necesita hacer cosas según la versión, eche un vistazo a los componentes principales que son relevantes para usted:
Component Version command
glibc /lib/libc.so.6
gcc gcc --version
X xdpyinfo
libX11 pkg-config --modversion x11
gtk+ pkg-config --modversion gtk+-2.0
qt-4 pkg-config --modversion QtCore
etc...
También puede consultar el menú Grub, que generalmente le ofrece un montón de información de distribución / versión :-)
FusionInventory es una herramienta de inventario ligera multiplataforma que puede obtener esta información en muchas distribuciones de Linux, pero también en BSD, Windows, MacOS X y otros dispositivos.
Si están disponibles, usan lsb_release
(como se mencionó varias veces anteriormente), pero si no tienen una lista muy útil de archivos y expresiones regulares para verificar el nombre y la versión de la distribución: https://github.com/fusinv/fusioninventory-agent/ blob / 2.2.x / lib / FusionInventory / Agent / Task / Inventory / Input / Linux / Distro / NonLSB.pm # L16 .
Recomendaría usar FusionInventory para obtener esta información, en lugar de volver a implementar sus propios scripts con esta lógica, ya que su comunidad mantendrá esta funcionalidad actualizada. Puede usar el agente por sí mismo (genera un archivo XML / JSON que es fácil de analizar) o acoplarlo con una solución más amplia para administrar las máquinas en su red como GLPI o Rudder , según sus necesidades.