Atualmente, estou definindo uma configuração bash bastante complexa que deve ser usada em várias máquinas. Tento descobrir se é possível determinar se estou logado via SSH ou em uma máquina local. Dessa forma, eu poderia, por exemplo, definir alguns aliases dependendo desse fato. Como aliasing halt
para restart
uma vez de parar um servidor remoto pode não ser a melhor coisa a fazer.
O que eu sei até agora é que a variável de ambiente SSH_CLIENT
é definida quando eu entrei no ssh. Infelizmente, essa variável é descartada quando inicio um shell de superusuário sudo -s
. Eu também sei que posso passar um parâmetro para o sudo que instrui o sudo a copiar todas as minhas variáveis de ambiente para o novo ambiente de shell, mas se eu não quiser fazer isso, existe outra maneira?
ps afx
e o TTY do shell que não está sendo executadops
será o outro logon.who am i
.who am i
, para que você possa determinar a partir daí se está SSHing ou não. Isso funciona:hostname=$(who am i | cut -f2 -d\( | cut -f1 -d:)
who
com dois argumentos extras.who am i
é o mesmo quewho is me
ouwho is awesome
ouwho potato potato
. Um fato que achei um pouco interessante.Aqui está uma ótima resposta que encontrei no unix.stackexchange :
SSH_CLIENT
ouSSH_TTY
for definida, é uma sessão ssh.ps -o comm= -p $PPID
. Se forsshd
, é uma sessão ssh.fonte
Você pode adicionar
SSH_*
aenv_keep
nosudoers
modo que este pode ser detectado quando mudou para o outro usuário.fonte
Se você quiser saber se o bash shell é diretamente um processo filho do sshd (não com n> 1 camadas de profundidade), você pode
deve fornecer a você
sshd
ou qualquer que seja o nome do processo pai do seu shell atual.fonte
ps -o cmd= $PPID
ouawk '/^Name:/ {print $2}' /proc/$PPID/status
Eu acho que você quer repensar a maneira como está pensando no problema. A questão não é "Estou logado via SSH, porque quero desativar certos comandos". É "estou logado no console, porque habilitarei certos comandos".
fonte
Sim, como outros observaram, as informações estão na presença do seu IP entre parênteses na saída de
who am i
.Você pode usar expressões regulares do Bash para detectá-lo:
fonte
Eu vim com o seguinte, com base em dicas de outras pessoas aqui.
Ele usa uma variável para armazenamento em cache - eu estou usando no meu tema de shell.
Fonte:
is_ssh
em https://github.com/blueyed/oh-my-zsh/blob/master/themes/blueyed.zsh-theme#L51-63 .fonte
Procure o cmdline pai do seu shell e recorra. Talvez algo como o seguinte:
Editado para fazê-lo realmente funcionar :)
fonte
Todas as outras respostas funcionam se você estiver no primeiro nível de login. Mas se, após o login, você executar 'su' ou 'sudo' (no meu caso, para alternar para uma conta de usuário sem shell por motivos de segurança, eu teria que executar: sudo su - <userid> -s / bin / bash - l) , sua solução falha.
A seguir, é uma solução universal; usando pstree, você verifica o sshd como pai.
Aqui está a saída do egrep, quando --quiet é removido. Ele mostra toda a hierarquia que corresponde se uma estiver conectada remotamente.
fonte
Lembre-se de que esta resposta é muito, muito específica do Linux.
Isso faz uma suposição importante: o processo de login não terá um TTY de controle; você provavelmente deseja verificar se possui um TTY de controle antes de executar este código (que, com base nos seus requisitos, provavelmente é uma aposta segura).
O código itera para cima através da árvore de processos, até encontrar o processo que não possui controle TTY.
$initiator_name
será o nome desse processo ("sshd", por exemplo).fonte