$ fixpath /home/user/docus/collection/unix/djakl/jfkdsl/dfjksld/fsdkl
Found /home/user/docus/collection/unix
$ type fixpath
fixpath is a function
fixpath ()
{
CURDIR="$PWD";
DIR="$1";
E=1;
while [ $E -eq 1 ]; do
cd "$DIR" 2> /dev/null && {
E=0;
echo Found "$DIR"
} || {
DIR="${DIR%/*}";
DIR="${DIR:-/}"
};
done;
cd "$CURDIR"
}
Автоисправление подобия большинство современных оболочек может сделать себя. По крайней мере, удар и zsh делают.
Это - своего рода взлом, но по крайней мере он работает. Это требует, чтобы Вы имели root
на том сервере:
Рассмотрение вывода ps aux
Я вижу ветвление пользователя sshd
, как, например, в этом случае пользователь mst
:
$ ps aux | grep ssh
mst 19325 0.0 0.0 76268 1920 ? S 21:20 0:00 sshd: mst@pts/6
Таким образом, я проверяю дескрипторы файлов этого процесса как это:
$ sudo ls -lha /proc/19325/fd
total 0
dr-x------ 2 root root 0 Aug 30 21:26 .
dr-xr-xr-x 7 mst users 0 Aug 30 21:25 ..
lrwx------ 1 root root 64 Aug 30 21:26 0 -> /dev/null
lrwx------ 1 root root 64 Aug 30 21:26 1 -> /dev/null
lrwx------ 1 root root 64 Aug 30 21:26 11 -> /dev/ptmx
lrwx------ 1 root root 64 Aug 30 21:26 12 -> /dev/ptmx
lrwx------ 1 root root 64 Aug 30 21:26 2 -> /dev/null
lrwx------ 1 root root 64 Aug 30 21:26 3 -> socket:[138972]
lrwx------ 1 root root 64 Aug 30 21:26 4 -> socket:[138198]
lrwx------ 1 root root 64 Aug 30 21:26 5 -> socket:[138200]
lrwx------ 1 root root 64 Aug 30 21:26 6 -> socket:[138207]
lr-x------ 1 root root 64 Aug 30 21:26 7 -> pipe:[138212]
l-wx------ 1 root root 64 Aug 30 21:26 8 -> pipe:[138212]
lrwx------ 1 root root 64 Aug 30 21:26 9 -> /dev/ptmx
Три из этих ссылок указывают /dev/ptmx
, это stdin
, stdout
и stderr
. Так как оболочка пользователя печатает все команды, которые он вводит, и также вывод этих команд, я наблюдаю его stdout
при помощи strace
и фильтрация для read
системные вызовы на fd числе 11
(потому что 11
вторая ссылка на /dev/ptmx
).
sudo strace -e read -s 256 -p 19325 2>&1 | grep 'read(11'
И я вижу, что пользователь вводит ls
команда:
read(11, "l", 16384) = 1
read(11, "s", 16384) = 1
Хорошо, вывод не довольно..., но работы
Лучший способ состоит в том, чтобы использовать auditd. Можно установить его для входа всех команд, данных определенным пользователем или всех команд, данных всеми пользователями или любым вызовом определенной команды, и т.д.
Страница справочника для auditctl
даст Вам некоторые примеры правил, которые можно хотеть. Кроме того, если бы Вы не доверяете другим пользователям root, я советовал бы Вам регистрироваться к отдельному серверу, к которому у других нет доступа.
Я также предположил бы, что лучше не выделить пароль root и не позволить логины ssh как корень. Вместо этого позвольте только логины собственных учетных записей пользователя и позвольте им использовать sudo su
стать корнем. Это также позволит auditd отследить, который пользователь сделал что.