Solución 1:
No hay forma de distribución cruzada. Sin embargo:
- Redhat y amigos:prueba para
/etc/redhat-release
, comprobar contenidos - Debian:prueba para
/etc/debian_version
, comprobar contenidos - Mandriva y amigos:prueba para
/etc/version
, comprobar contenidos - Slackware:prueba para
/etc/slackware-version
, comprobar contenidos
Etc. En términos generales, busque /etc/*-release
y /etc/*-version
.
Editar:Encontré un script bash antiguo (más de 1 año) por ahí que debo haber improvisado a lo largo de los años (tiene un impresionante registro de CVS que se remonta a 6 años). Es posible 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 shells.
Dicho esto, es posible que desee probar las funciones, no las distribuciones. Ya no uso esto simplemente porque se convirtió en una carga de mantenimiento. Es más fácil confiar en las herramientas y soluciones de distribución cruzada.
Conceptualmente, lo que hace es, en orden:
- Acceda a un tipo de archivo conocido de "función de secuencia de comandos de inicio común". Esos son específicos de la distribución. Si no existe, pase a la siguiente verificación de distribución.
- Verifique la existencia de una función específica, que se sabe que existe, que se usa con frecuencia y que es poco probable que cambie de nombre de esa secuencia de comandos principal. Hacemos eso usando el
type
Bash incorporado.type -t
devuelvefunction
si ese símbolo es una función. Anteponemoszz
a 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 la falta de la mano izquierda en el==
operador. Si el nombre que acabamos de verificar no es una función, pase a la siguiente verificación de distribución; de lo contrario, encontramos el tipo de distribución. - Finalmente, haga eco del tipo de distribución para que la salida de la función se pueda usar fácilmente en un bloque case .. esac.
Edite en caso de que intente ejecutar esto como una secuencia de comandos directa:se supone que esta secuencia de comandos se obtiene o se incluye desde otras secuencias de comandos. No genera nada por sí solo si lo ejecuta tal como está. Para probarlo, consígalo y luego invoque la función, por ejemplo:
source /path/to/this/script.sh
get_distribution_type
en el aviso de bash.
Editar:tenga en cuenta que este script no requiere privilegios de root. Le insto a que no lo ejecute como root. No debería dañar nada, pero no es necesario.
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 del script de inicio.
Solución 2:
No intente hacer suposiciones basadas en la distribución en cuanto a lo que puede y no puede hacer, porque de esa manera es una locura (consulte también "Detección de agente de usuario"). En su lugar, detecte si lo que desea hacer es compatible y cómo lo hace el comando o la ubicación del archivo que desea 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 (verifique primero si hay 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 esa manera, admitirá automáticamente cualquier distribución derivada que no programó explícitamente. Ah, y si su paquete requiere dependencias específicas, pruébelas también y dígale al usuario lo que se está perdiendo.
Otro ejemplo es jugar con las interfaces de red. Averigüe 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 durante la última década o más, lo hará de manera inteligente desde el principio.
Solución 3:
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 algunos otros sistemas operativos, puede ejecutar lsb_release -a
o lea /etc/lsb_release
Debian almacena la versión en /etc/debian_version
Solución 4:
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 devolverá información sobre su distribución de Linux.
lsb_release -a
Solución 5:
python -c 'import platform ; print platform.dist()[0]'
código:http://hg.python.org/cpython/file/2.7/Lib/platform.py