Posso recursivamente imprimir todos os shells remotos atuais?

5

Existe uma maneira de imprimir todos os shells locais e remotos em que estou atualmente, de forma recursiva?

Por exemplo, na minha máquina local, eu vou ssh em outra máquina. De lá, eu posso trocar de usuário (abrindo outro shell). Então eu ssh para minha máquina local novamente, etc. E para complicar, eu geralmente terei várias abas (e até janelas) de shells, então normalmente não consigo lembrar minha trilha para cada uma.

O que eu gostaria é que cada uma dessas sessões seja impressa na ordem em que estou. Ou pelo menos que shell eu vou ser chutado de volta se eu exit o shell atual.

Depois de alguns dias ou semanas de ter vários shells abertos, não tenho idéia de para onde serei enviado se eu digitar exit . Minha janela do shell fechará (porque eu estou no shell 'root')? Eu vou ser chutado de volta para outro servidor?

Em outras palavras, gostaria de um rastreamento dos meus saltos de SSH.

    
por Stephen Schrauger 05.07.2013 / 17:57

3 respostas

2

Você pode escrever um script que simplesmente percorra a árvore de processos, imprimindo nomes de usuários / pids / executáveis / qualquer coisa que tenha subido na lista, parando quando finalmente saiu do terminal. O sshd geralmente começa a escutar em um TTY depois que ele já fez o setuid () para o usuário, assim o processo mais antigo conectado ao TTY estará sendo executado como o usuário com o qual você se logou.

Aqui está uma versão de script Bash específica do Linux do conceito.

saída de script:

Sudo simples à raiz:

[root@ditirlns04 ~]# ./test.sh
Current User: 0
Previous UID: 504

O UID 504 é como eu loguei na caixa, então funcionou:

[root@ditirlns04 ~]# logname
jadavis6
[root@ditirlns04 ~]# id jadavis6
uid=504(jadavis6) gid=504(jadavis6) groups=504(jadavis6),16777216(enterprise admins),16777217(ncatsys),16777218(sms admins),16777219(domain admins),16777220(aggieanywhere),16777221(group policy creator owners),16777222(tlh-test),16777223(dba admins),16777224(domain controllers),16777225(cupsadmin),16777226(linuxusers),16777227(da admins),16777228(webdev),16777229(schema admins),16777230,16777231(changeauditor operators - ncat),16777232(configmgr remote control users),16777233(changeauditor administrators - ncat),16777234(telnetclients),16777235(denied rodc password replication group)

O mesmo que acima, passando apenas por um usuário intermediário (ou seja, logado em 504, sudo para root, sudo para UID regular de 501 e, em seguida, de volta à raiz):

[root@ditirlns04 ~]# ./test.sh
Current User: 0
Previous UID: 501
Previous UID: 0
Previous UID: 504
[root@ditirlns04 ~]#

Assim, cada transição de UID é capturada na ordem inversa em que aconteceu. Se você precisar dela na mesma ordem, basta colocar o script em uma função em que você tac a saída:

[root@ditirlns04 ~]# ./test.sh | tac
Previous UID: 504
Previous UID: 0
Previous UID: 501
Current User: 0
[root@ditirlns04 ~]#

corpo do script:

#!/bin/bash

currentPID=$$
currentUser=$(id -u)
currentTTY=$(awk '{print $7}' /proc/$$/stat)

echo "Current User: $currentUser"

while /bin/true; do

  parentPID=$(awk '{print $4}' /proc/$currentPID/stat)
  parentTTY=$(awk '{print $7}' /proc/$currentPID/stat)

  if [ $parentTTY -ne $currentTTY ]; then
     break
  fi

  parentUser=$(awk '/^Uid:/ {print $2}' /proc/$currentPID/status)

  if [[ "x$parentUser" != "x$currentUser" ]]; then
     echo "Previous UID: $parentUser"
  fi

  currentPID=$parentPID
  currentUser=$parentUser

done

Basicamente, ele usa apenas os arquivos per-pid stat e status . Você poderia fazer mais versões independentes de plataforma envolvendo ps output, mas eu não confio na saída do comando parsing quando o dado está prontamente disponível em um formato que deveria ser analisado, então eu fui a rota procfs.

Basicamente, sempre que encontra um novo UID, ele é impresso. Eles têm a garantia de estar na mesma ordem que o usuário sudo'd, então ele deve cobrir efetivamente toda a sua sessão de login nessa máquina. Você deve ser capaz de modificar facilmente os itens acima para imprimir PIDs ou nomes de comandos, se você quiser, mas geralmente as pessoas que pensam nesta área estão mais preocupadas com quem eles estarão executando, ao invés do programa shell que estará rodando. / p>     

por 05.07.2013 / 18:36
1

Um shell iniciado a partir de sshd pode identificar isso pela presença da variável $SSH_CLIENT . Outra variável, $SHLVL , pode indicar um shell iniciado a partir de outro shell no mesmo host. Se você precisar rastrear mais, escolha uma variável e permita que sshd a aceite de clientes ssh remotos.

    
por 05.07.2013 / 20:36
1

Você pode ver seus shells usando o seguinte comando ps . Não é perfeito, mas faz um bom trabalho mostrando a hierarquia dos shells em um formato de árvore legal:

$ ps auxw --forest | grep -E "gnome-terminal|\_ bash|-bash|sshd|login "

Além disso, você pode descobrir em qual shell você está, simplesmente olhando o PID do shell atual usando $$ :

$ echo $$

Exemplo

$ ps auxw --forest | grep -E "gnome-terminal|\_ bash|-bash|sshd|login "
root      1751  0.0  0.0  67824   820 ?        Ss   Jun24   0:00 login -- root     
root       989  0.0  0.0 114116   928 tty2     Ss+  Jun30   0:00  \_ -bash
saml      6018  0.0  0.1 553356 13296 ?        Sl   Jun24   3:42 gnome-terminal
saml      8182  0.0  0.0 115104   992 pts/2    Ss+  Jun24   0:00  \_ bash
saml      3483  0.0  0.0 115156   936 pts/62   Ss   Jun27   0:02  \_ bash
saml      3742  0.0  0.0 114972  1712 pts/64   Ss+  Jun28   0:00  \_ bash
saml      7368  0.0  0.0 122544  4608 pts/65   Ss   Jun28   0:05  \_ bash
saml     32256  0.0  0.0 114980  6320 pts/65   S    20:54   0:00  |   \_ bash
saml      3753  0.0  0.0 115036  1960 pts/81   Ss+  Jul03   0:01  \_ bash
saml     12843  0.0  0.0 115076  5204 pts/82   Ss+  Jul03   0:01  \_ bash
saml     14702  0.0  0.0 114972  6392 pts/87   Ss   16:04   0:00  \_ bash
root     26084  0.0  0.0  75096  1152 ?        Ss   09:40   0:00 /usr/sbin/sshd
root     32345  0.0  0.0 106716  3840 ?        Ss   20:55   0:00  \_ sshd: saml [priv]
saml     32349  0.0  0.0 106716  1800 ?        S    20:55   0:00      \_ sshd: saml@pts/88
saml     32352  0.0  0.0 114908  6304 pts/88   Ss   20:55   0:00          \_ -bash
saml     32764  0.0  0.0 103380   820 pts/88   S+   21:02   0:00              \_ grep --color=auto -E gnome-terminal|\_ bash|-bash|sshd|login 

Qual é o meu PID?

$ echo $$
32352
Então estou aqui:

saml 32352 0.0 0.0 114908 6304 pts/88 Ss 20:55 0:00 _ -bash

 # Now if I exit
 $ exit

  # I'm in this shell now
 $ echo $$
 32256
Agora estou aqui:

saml 32256 0.0 0.0 114980 6320 pts/65 S 20:54 0:00 | _ bash

 # Another exit
 $ exit

 # I'm now here
 $ echo $$
 7368
Finalmente estou aqui:

saml 7368 0.0 0.0 122544 4608 pts/65 Ss Jun28 0:05 _ bash

    
por 06.07.2013 / 02:57

Tags