Teste se operando a partir da sessão ao vivo ou não dentro de um shell script

2

Eu tenho um shell script que só pode ser executado a partir de uma sessão ao vivo (LiveCD ou Live USB) porque ele reduz o sistema de arquivos raiz de uma instalação real, o que só pode ser feito quando o sistema de arquivos não está montado.

Se o script for executado a partir da sessão ao vivo, ele deverá prosseguir com sua execução. Caso contrário, deve falhar.

Não consigo encontrar uma maneira de diferenciar a sessão ao vivo e uma sessão de usuário "normal", já que a sessão ao vivo tem uma aparência muito próxima das sessões do sistema instaladas. A única coisa que posso dizer até agora é que as sessões ao vivo sempre têm ubuntu como o nome do host, mas eu não posso contar com isso, já que o usuário pode escolher isso ao instalar o Ubuntu.

Existe uma maneira de identificar isso em um script de shell / linha de comando?

(hesitei entre postar em Ask Ubuntu ou Stack Overflow , posso excluir a postagem e postar novamente em Stack Overflow se mais apropriado)

    
por astorije 01.04.2014 / 20:16

2 respostas

1

Não, o nome é arbitrário, você não pode assumir nada com base nisso. No entanto, a sessão ao vivo tem algumas peculiaridades, como:

$df -h | grep -w /
/cow        2.0G   42M   1.9G  3% /

Como você pode ver, o dispositivo especial /cow está montado em / . Eu não tenho certeza de quão portátil isso é, eu duvido que seja o mesmo para Linux não Ubuntu e também pode mudar em versões futuras, mas desde que não seja um dispositivo real em /dev você pode testar isso com muita facilidade:

df | grep -w / | grep -q 'cow' && echo "Live session" || echo "Normal install"

Explicação:

  • df : sistemas de arquivos montados em impressão
  • grep -w / : imprime apenas a linha que mostra o que está montado em / . A opção -w corresponde apenas a palavras inteiras, de modo que apenas / e não, por exemplo, /home , serão impressas.
  • grep -q cow : O -q suprime a saída, grep sairá com status > 0 (erro) se cow não foi encontrado e 0 (correto) se foi.
  • && echo "Live session" : Print Sessão ao vivo if the grep 'foi bem-sucedida
  • || echo "Normal install" : Else, imprimir Normal install .

EDITAR PELO OP

No final, aqui está a solução que implementei no meu script, se for útil:

#!/bin/bash

if [ ! $(df | grep -w / | grep -q '/cow') ]; then
  printf "This script must be run from a live session.\n"
  exit 1
fi
    
por terdon 01.04.2014 / 20:28
3

Existem muitas características distintas entre uma sessão ao vivo e uma sessão normal. No primeiro tiro vem em minha mente que não há usuário real em uma sessão ao vivo. Pode-se explorar isso.

Portanto, não haveria gid maior que 999 em /etc/passwd corresponde a qualquer usuário real, exceto nobody usuário.

$ awk -F: '($3>=1000){print $1}' /etc/passwd
nobody

O seguinte script deve funcionar,

#!/bin/bash

var=$(awk -F: '($3>=1000){print $1}' /etc/passwd | wc -l)
if [[ $var -gt 1 ]]; then
    echo "normal session"
else
    echo "live session"
fi
    
por souravc 01.04.2014 / 21:18