como saber quem está falhando ao fazer ssh com teste

0

Digamos que eu queira fazer algum teste VIA ssh

exemplo

ssh 18.23.24.2 2>/dev/null "smartctl -a /dev/sdb -q silent"

echo $?
1

Nesse caso, obtemos o código de saída 1

Como saber se o problema é sobre o ssh ou sobre o comando smartctl?

    
por yael 22.11.2018 / 13:32

2 respostas

2

A determinação é difícil, pois muitos processos usam o mesmo valor.

% ssh 2>/dev/null localhost 'exit 255' ; echo $?
255
% ssh 2>/dev/null nopelocalhost 'exit 0' ; echo $?
255

Com uma heurística, você poderia adivinhar qual código é de qual programa baseado em códigos de saída comumente usados; isso seria mais correto, a menos que os programas envolvidos se sobreponham ou algo inesperado aconteça. Erro padrão pode ou não estar disponível e o código de saída pode mudar dependendo de como o programa sai:

% ssh localhost ./segfault ; echo $?
255
% ./segfault ; echo $?
zsh: bus error  ./segfault
138
% 

Assim, não é tão confiável adivinhar de onde veio $? . Em vez disso, uma opção melhor pode ser projetar um protocolo que comunique mais informações do que as fornecidas pela palavra de status de saída; exemplos incluem Nagios ou Ansible que comunicam mais do que apenas $? ao determinar como um comando remoto foi executado. Isso pode ser tão simples quanto uma linha de texto que depende de como smartctl foi executada (ou segfaulted, ou ...) ou algo mais complicado como uma estrutura JSON com a saída padrão, err, status de saída e outros metadados . Portanto, em vez de executar smartctl diretamente, você chamaria o programa wrapper que executa smartctl e analisa sua saída e, do outro lado de ssh , coletaria essa saída; se a saída não estiver disponível, algo deu errado com o ssh ou com o programa wrapper.

    
por 22.11.2018 / 17:20
3

De manpages:

EXIT STATUS
     ssh exits with the exit status of the remote command or with 255 if an error occurred.

Se um erro ocorrer com o comando ssh, ele retornará 255, caso contrário, retornará o status de saída do comando remoto.

Exemplo:

$ ssh [email protected]
ssh: Could not resolve hostname not.exists: Name or service not known
$ echo $?
255

No seu caso, 1 é o status de saída do comando smartctl , não ssh

EDITAR:

status de saída do smartctl:

EXIT STATUS
       The  exit  statuses  of  smartctl  are  defined by a bitmask.  If all is well with the disk, the exit status (return value) of smartctl is 0 (all bits turned off).  If a problem occurs, or an error,
       potential error, or fault is detected, then a non-zero status is returned.  In this case, the eight different bits in the exit status have the following meanings for ATA disks; some of these  values
       may also be returned for SCSI disks.

       Bit 0: Command line did not parse.

       Bit 1: Device open failed, device did not return an IDENTIFY DEVICE structure, or device is in a low-power mode (see '-n' option above).

       Bit 2: Some SMART or other ATA command to the disk failed, or there was a checksum error in a SMART data structure (see '-b' option above).

       Bit 3: SMART status check returned "DISK FAILING".

       Bit 4: We found prefail Attributes <= threshold.

       Bit 5: SMART status check returned "DISK OK" but we found that some (usage or prefail) Attributes have been <= threshold at some time in the past.

       Bit 6: The device error log contains records of errors.

       Bit 7: The device self-test log contains records of errors.  [ATA only] Failed self-tests outdated by a newer successful extended self-test are ignored.

exit status 1 no smartctl significa que o bit 0 está ligado, desde 1 = 2 ^ 0, de modo que a linha de comando não analisou

    
por 22.11.2018 / 13:38