Detectar montagens sshfs remotas na máquina local

2

Gostaria de voltar à pergunta de este postar.

Quando um usuário em um cliente remoto monta um diretório de um servidor local em seu sistema de arquivos através de sshfs , ele não fica visível no servidor através de who ou last . A solução alternativa a seguir para o servidor é proposta na pergunta vinculada:

ps aux | grep -i sftp | grep -v grep

Mas fornece informações modestas: apenas o nome de usuário e a presença de uma conexão sftp. Como no comentário da resposta escolhida, gostaria de perguntar (sobre o servidor ):

1) Existe um comando mais compacto e dedicado?

2) Existe uma maneira de obter mais informações? Gostaria de saber (do servidor): o nome de usuário que executou a operação e o nome do host ou endereço IP do cliente remoto, o diretório montado do servidor e a hora em que a montagem foi iniciada.

Suponha que o servidor esteja executando o Ubuntu 14.04, mas seria bom se os comandos estivessem disponíveis em todos os sistemas * nix.

    
por BowPark 04.06.2015 / 15:26

1 resposta

1

É impossível distinguir do servidor uma sessão SFTP que o cliente acessa via SSHFS de uma sessão SFTP que o cliente acessa por meio de outro software cliente. Mas você pode definitivamente obter mais informações sobre a sessão do SFTP.

Cada sessão SFTP tem um processo sftp-server associado. No Linux, você pode listar os IDs do processo que estão executando sftp-server com pgrep -x sftp-server ou ps -C sftp-server . Como alternativa, você pode usar o seguinte comando compatível com POSIX (ajuste o caminho para sftp-server , se necessário):

ps -e -o pid,cmd | sed -n 's!^\([0-9]*\) /usr/lib/openssh/sftp-server$!!p'

Esse processo está sendo executado sob a conta de usuário usada para efetuar login no SFTP. Foi iniciado quando a sessão do SFTP começou.

ps -e -o pid,user,etime,cmd |
awk '$4 == "/usr/lib/openssh/sftp-server" {print "pid=" $1, "user=" $2, $3 " ago"}'

A exibição da hora de início é incômoda no POSIX: você obtém o tempo decorrido desde o início do processo, em vez de uma data. A maioria dos sistemas tem algo mais conveniente. No Linux, alguns outros formatos estão disponíveis, mas nenhum deles é realmente conveniente. A data vem do campo 22 de /proc/$pid/stat , mas também é incômoda: é a data de início nos tiques do relógio (dividir pelo valor retornado por getconf CLK_TCK ou sysconf(_SC_CLK_TCK) ), exceto nos kernels mais antigos (< 2.6) em jiffies (cujo valor é ainda mais difícil de descobrir de forma confiável); o tempo de inicialização é o valor na linha btime de /proc/stat expressa em segundos desde a epoch (que você pode deseja converter para um formato legível por humanos ).

cat /proc/$pid/stat | awk '
    BEGIN {
        "getconf CLK_TCK" | getline ticks;
        while (!btime) {
            getline <"/proc/stat";
            if ($1 == "btime") btime = $2;
        }
    }
    { print "pid=" $1, "start_time=" int($22 / ticks + btime) }'

Você pode descobrir o endereço IP e a porta do cliente observando a variável SSH_CLIENT no ambiente desse processo. A maioria das variantes do Unix tem uma maneira de fazer isso, mas não foi padronizada pelo POSIX. No Linux, você pode usar

</proc/$pid/environ grep -z '^SSH_CLIENT='

Eu não acho que você possa descobrir qual é o diretório montado. O cliente SSHFS apenas envia informações sobre cada arquivo que deseja acessar.

Não tenho conhecimento de nenhum programa que colete todos esses dados para você, mas não faço muito esse tipo de coisa, então pode ser que eu não conheça.

    
por 07.06.2015 / 03:11