Определить оболочку, из которой было вызвано переподключение экрана.

Это потенциально немного опасно, но

cp * destination/
rm *

Поскольку и cp, и rm не будут работать с каталогами без переключателя -r.

0
04.03.2020, 21:36
1 ответ

После долгих экспериментов вот что у меня получилось:

  • Найдите экран, под которым работает оболочка. Продолжайте обход pstree, пока не будет найден экранный процесс :
    .screen_pid=$(pstree -psUA $$ | egrep -o 'screen\([0-9]+\)' | tail -1 | egrep -o '[0-9]+')

  • Просмотр всех открытых файлов для этого процесса.Найдите единственный файл /dev/pts/ *в этом списке:
    screen_pts=$(lsof -p $screen_pid | grep /dev/pts | awk '{print $NF}')

  • Найдите экранный процесс, управляющий этим псевдо-терминалом -:
    ps -o pid=,tty= -C screen | grep ${screen_pts/\/dev\/} | awk '{print $1}'

  • Оттуда родительским процессом будет оболочка/ssh/что угодно, запустившее экран, который теперь присоединен к оболочке.

Определенно здесь сделаны некоторые хакерские предположения, что «работает на моей машине (tm )», но это общая идея.

Если требуется надежность, использование statс st_rdevустранит хакерскую замену /dev/pts/5 -> pts/5. И что-то подобное можно использовать для фильтрации списка открытых файлов, где major(st_rdev)== какое-то значение, представляющее псевдотерминалы.

0
28.04.2021, 23:21

Теги

Похожие вопросы