Если у вас есть GNU ls
:
ls --time-style=long-iso -l
или
ls --time-style=+FMT -l
, где FMT следует за форматом команды дата
. В вашем случае:
ls --time-style=+%Y/%m/%d -l
Мне удалось объединить тайм-аут ( sleep
), внешний heredoc, внутренний heredoc (s), nohup
, обработку на уровне фона и tty-stdout в следующем скрипте.
Это хорошо, если вам нужен быстрый способ установить что-то, а затем автоматически удалить это через некоторое время:
bash /dev/fd/5 5<< 'EOF0'
#!/bin/bash -x
apt-get install SOME_UTILITY1 -y
cat << EOF1 > ~/utility.sh
sleep 1h
apt-get purge SOME_UTILITY1 -y
EOF1
chmod 755 ~/utility.sh &
nohup ~/utility.sh &
EOF0
Нажмите return (Enter), когда получите следующее сообщение, чтобы продолжить нормальную работу в Bash (появится сообщение в тот момент, когда скрипт достигает nohup
:
nohup: добавление вывода в '/USER_LOCATION/nohup.out'
Прежде всего, вы должны разделить свой код на два сценария или, по крайней мере, на две отдельные функции в одном сценарии: первый для установки, второй для продувки. Таким образом, при необходимости вы можете запустить любой сценарий / функцию. Оба сценария / функции также должны быть идемпотентными, т.е. они должны пропускать установку / очистку, если это уже сделано.
Затем вы можете просто создать задание cron для вызова сценария очистки каждые 2 часа или создать более периодическое задание cron, которое вызывает сценарий очистки только в том случае, если срок установки не менее 2 часов. Это выдержит перезагрузку сервера, поэтому пакет всегда будет очищен.
IMHO, этот подход временно установка и очистка phpmyadmin - уродливый взлом. Вы можете просто ssh -L3307: localhost: 3306
, то есть создать прослушиватель на локальном порту ( -L3307
), который туннелирует и подключается к удаленному порту ( localhost : 3306
). Затем, если вы захотите поговорить с удаленной базой данных MySQL, вы просто воспользуетесь localhost: 3307
на локальном компьютере. Вам не нужно ничего устанавливать удаленно, туннель сразу умирает при отключении, и вы можете использовать любой инструмент MySQL локально (например, MySQL Workbench или SQirreL).
Как я вижу, у вас есть доступ sudo
, и вы можете запускать службы. Таким образом, вы можете использовать службу atd
и команду at
, чтобы запланировать свою задачу:
echo 'touch $HOME/`date -j +%s`.txt' | at + 2 minutes
И для более чем одной команды у вас есть два варианта:
Объединить echo
команды:
(echo "command1"
echo "command2"
echo "command3") | в +2 часа
Использовать временный файл для списка команд:
tmp_file = $ (mktemp --tmpdir uninstall_commands.XXXX)
echo "command1" >> $ {tmp_file} { {1}} echo "command2" >> $ {tmp_file}
echo "command3" >> $ {tmp_file}
at -f $ {tmp_file} + 2 часа
rm -f - $ {tmp_file}
Вы можете сделать это с помощью утилиты at
.
Для одной команды сделайте:
at 'now + 2 hours' -f /path/to/uninstall.sh
Для нескольких команд передайте ваш сценарий в оболочку через cat heredocument:
cat << EOF | at 'now + 2 hours'
command1
command2
........
EOF
Альтернативно, вы можете добиться этого с помощью systemd
(опять же, если он у вас установлен)
systemd-run --on-active=2h -- /bin/bash /path/to/uninstall.sh
Я не уверен, может ли это решение соответствовать вашим требованиям, но вы можете попробовать.
Если на мгновение забыть о выключении / перезагрузке ПК, то в bash без перехвата терминала будет работать следующее (вы можете попробовать это как однострочную команду для тестирования):
sleep 10 && yad --text="10 seconds passed" && exit &
Выше команда, хотя я этого не ожидал, работает, даже если я закрываю окно терминала.
PS: Если вы объедините его с nohup, команда будет продолжать работать, даже если вы выйдете из системы.
В качестве обходного пути вы можете разделить исходный скрипт на два меньших скрипта; один сценарий для установки один сценарий для удаления, что-то вроде этого:
#script_to_install.sh
sudo apt-get install phpmyadmin
sudo phpenmod mcrypt mbstring
printf 'Include /etc/phpmyadmin/apache.conf' >> /etc/apache2/apache2.conf
sudo service apache2 restart
sleep 7200 && path/to/script_to_remove.sh &
exit #exit the first script to free terminal (or even close the terminal)
#end of script_to_install.sh
#script_to_remove.sh
#Optionally you can use xterm -e (or similar) to bring up a terminal window automatically to see the output of the commands
sudo phpdismod mcrypt mbstring
sudo apt-get purge phpmyadmin
sudo service apache2 restart
sed -i 's/Include \/etc\/phpmyadmin\/apache.conf/ /g /etc/apache2/apache2.conf
exit
#end of script_to_remove.sh
Возвращаясь к части перезагрузки ПК, я думаю, что это можно решить, записав время начала во временный файл журнала, и после перезагрузки вы можете отслеживать этот временный файл (т.е. с использованием инструментов inotify) для определения истекшего периода времени (не проверено).
В bash добавьте ваш сценарий с оператором sleep в файл ~/.bash_logout
. В csh это будет .logout.
Мне также понравилось чье-то предложение использовать at. Вы также можете написать сценарий, который будет действовать как функция типа 'police' через cron.
Я нашел это на этом сайте, который может быть полезен: Как запустить скрипт во время выхода из Gnome
Предположим, что два сценария ( Do One Thing; Do It Well ):
install.sh
#!/bin/sh -eu
sudo apt-get install phpmyadmin
sudo phpenmod mcrypt mbstring
printf 'Include /etc/phpmyadmin/apache.conf' >> /etc/apache2/apache2.conf
sudo service apache2 restart
uninstall.sh
#!/bin/sh -eu
sudo phpdismod mcrypt mbstring
sudo apt-get purge phpmyadmin
sudo service apache2 restart
sed -i 's/Include \/etc\/phpmyadmin\/apache.conf/ /g /etc/apache2/apache2.conf
Самый простой ответ, который я могу придумать, делает именно то, что вы хотите это
./install.sh && sleep 2h && ./uninstall.sh >>/var/log/mylog.log 2>&1
, где каждый сценарий дополнительно включает команду ssh для подключения к вашему серверу. Такой подход устойчив к отключению и выключению питания сервера, но не к вашему терминальному компьютеру.
В качестве альтернативы я бы упростил этот ответ в основном из-за странного поведения, когда atd помещает свой вывод и вместо этого использует
nohup sleep 2h && ./uninstall.sh >>/var/log/mylog.log 2>&1 &
После выполнения у вас теперь есть примерно 2 часа, чтобы сделать то, что вы хотите сделать, и по истечении времени начнется процесс удаления. Такой подход не устойчив к циклическому отключению питания сервера.
Этот ответ позволяет избежать зависимостей и позволяет проводить диагностику / отладку путем разумного сбора и регистрации соответствующих выходных данных.
Есть способы получше.
Установите phpMyAdmin на выделенный виртуальный хост с портом, который вам известен только (скажем, 56887
).
Настройте knockd
, чтобы открыть этот порт по вашему запросу, только для вашего IP.
[phpMyAdmin]
последовательность = 2000,3000,4000
seq_timeout = 15
start_command = / usr / sbin / iptables -A INPUT -s% IP% -p tcp --dport 56887 -j ACCEPT
cmd_timeout = 7200
stop_command = / usr / sbin / iptables -D INPUT -s% IP% -p tcp --dport 56887 -j ACCEPT
Используйте удобный knock
, чтобы открыть порт:
knock myserver.example.com 2000 3000 4000 {{1} }
Вот и все! Переустановка не требуется. Файлы не перемещены.
Применяются обычные меры безопасности посредством оговорок о неразглашении. Небезопасно настроенный phpMyAdmin может быть недостаточно защищен любым подобным взломом. Вы должны правильно его настроить, несмотря ни на что. Но если вы это сделаете, эти хаки станут ненужными.