É 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.