Como o Bash pode determinar se está sendo executado devido a um rsync sobre o ssh?

2

Preciso que meus scripts init do Bash sejam capazes de distinguir

  • tendo sido invocado como ssh me@host /some/complicated/operation e
  • tendo sido invocado como rsync -e ssh /src me@host:/dest

No primeiro caso, há muitas inicializações que quero executar, mas no segundo caso, sempre quero pular essas inicializações. Que ambiente ou variável de Bash posso usar para diferenciar esses casos?

(Nota: Esta é uma pergunta auto-respondida.)

    
por dg99 01.03.2016 / 20:24

2 respostas

5

Invocar rsync sobre ssh como acima (sem outras opções de conexão) fará com que o sshd remoto crie um sub-processo como este (supondo que seu shell padrão no host remoto seja bash):

bash -c rsync --server [-options] [--long-options] ...

Este shell é o único que faz o seu arquivo init e assim no seu arquivo init você pode fazer uso da variável shell

BASH_EXECUTION_STRING
      The command argument to the -c invocation option.

assim:

if [[ "$BASH_EXECUTION_STRING" == rsync\ --server\ * ]]; then return; fi

Shells gerados por conexões SSH regulares (não rsync) não corresponderão a esse comando e, portanto, se comportarão normalmente.

    
por 01.03.2016 / 20:24
1

Se você está procurando uma solução para determinar se está executando uma sessão interativa ou não, isso pode ajudar:

if [[ $- == *i* ]]
then
  echo "You are in interactive mode
else
  echo "Non-Interactive session"
fi
    
por 01.03.2016 / 20:40