Как предотвратить завершение работы, когда пользователь SSH зарегистрирован?

Ваше заключение в кавычки является неправильным. Когда Вы пишете $CMD без кавычек, значения $CMD разбит в “слова” в каждом пробельном ¹ последовательности (слова могут содержать любой непробельный символ включая пунктуацию), и затем каждое слово подвергается globbing (т.е. подстановочное расширение). Обратите внимание что кавычки в значении CMD, в частности, являются нетронутыми: кавычки имеют значение в синтаксисе сценариев оболочки, но не в подстановке переменных. После этого первое слово становится названием команды для выполнения, и последующие слова являются аргументами команды.

В Вашем примере, принимая $KEYNAME somekeyname и $HZID somehzid, затем команда и аргументы:

./dnscurl.pl
--keyname
$KEYNAME
--
-X
POST
-H
"Content-Type:
text/xml;
charset=UTF-8"
--upload-file
/tmp/file.xml
https://route53.amazonaws.com/2010-10-01/hostedzone/somehzid/rrset

Отметьте это text/xml; появляется как первый аргумент неопции; ясно сценарий Perl передает тот аргумент curl. -- в списке аргументов не связано с Вашей проблемой.

Нет никакого способа наполнить командную строку в переменную. (Простая) переменная является неправильным инструментом для который: это содержит строку, но командная строка является списком строк (команда и ее аргументы). Можно наполнить название команды и его аргумент в переменную типа массив:

CMD=(./dnscurl.pl --keyname "$KEYNAME"  --
     -X POST -H "Content-Type: text/xml; charset=UTF-8"
     --upload-file /tmp/file.xml
     "https://route53.amazonaws.com/2010-10-01/hostedzone/$HZID/rrset")
RESULT=$("${CMD[@]}")

Странно выглядящий синтаксис "${CMD[@]}" разворачивает переменную типа массив CMD к списку слов в массиве. Двойные кавычки предотвращают расширение слов в массиве, и [@] необходим по историческим причинам сказать оболочке, что Вы хотите развернуть массив.

Другим способом помнить командную строку или произвольный отрывок оболочки, для более позднего использования, является функция.

cmd () {
    ./dnscurl.pl --keyname "$KEYNAME"  -- \
                 -X POST -H "Content-Type: text/xml; charset=UTF-8" \
                 --upload-file /tmp/file.xml \
                 "https://route53.amazonaws.com/2010-10-01/hostedzone/$HZID/rrset"
}
RESULT=$(cmd)

¹ более точно, согласно значению IFS.

20
13.04.2017, 15:36
3 ответа

Я записал бы небольшую программу, которая проверила на любые активные соединения SSH через netstat и/или ps. Отбросьте его вместо shutdown команда.

Если никто больше не использует машину, звонить shutdown когда пользователь пытается. Если кто-то использует машину, просто предупредите пользователя, который вышел shutdown команда.

Netstat даст Вам вывод как это, и довольно легко искать .ssh в выводе.

netstat -a
Active Internet connections (including servers)
Proto Recv-Q Send-Q  Local Address          Foreign Address        State
tcp        0     52  10.5.6.xx.ssh          10.6.6.yy.51400        ESTABLISHED
tcp        0      0  *.ssh                  *.*                    LISTEN
udp        0      0  *.syslog               *.*

ps даст Вам вывод как это, но это немного более твердо, потому что необходимо удостовериться, что не волновались об исходящих соединениях. Netstat вероятно, правильный способ пойти.

  ps -e | grep ssh
      10084366 ?        00:00:07 /opt/sbin/sshd
        282647 ?        00:00:00 /opt/sbin/sshd
3
27.01.2020, 19:44
  • 1
    Действительно хорошие Звуки. Я думаю, что более устойчивый путь состоит в том, чтобы увеличить PAM SSH session цепочка с программой, которая касается файла, когда пользователь регистрирует на пути SSH и удаляет его, когда пользователь выходит из системы и затем имеет программу, Вы предложили просто проверку на существование этих файлов. Если это работает, я принимаю Ваш ответ. –  Joseph R. 28.02.2013, 20:01
  • 2
    Это должно работать. Одна мысль: что происходит, если они разъединяются без того, чтобы выходить из системы? Файл становится затронутым, если сессия SSH просто умирает? Вы хотели бы удостовериться, что это делает –  kmort 28.02.2013, 20:13
  • 3
    Хм. Это - действительно пища для размышления... –  Joseph R. 28.02.2013, 20:22
  • 4
    Возможно, Ваш подход может быть упрощен путем парсинга вывода who вместо этого. Это показывает, какой пользователь (пользователи) соединен и от который хост. –  Joseph R. 28.02.2013, 20:31
  • 5
    Очень вероятно. На оболочке я использую больше всего who не дает очень вывод, но большинство других оболочек, которые он делает. (Глупая встроенная система...) В любом случае, если Вы хотите использовать netstat, довольно просто получить столбец, с которым Вы нуждаетесь awk. Что-то вроде netstat -a | awk '{print $4}' (По крайней мере, на моей оболочке.) –  kmort 28.02.2013, 20:50

Вы на самом деле нашли нужную информацию. По крайней мере, он работал под Ubuntu до 13,04.

Следующая политическая запись, при настройке «AUTH_ADMIN_KEON», как показано ниже, предпочтит отключение от происхождения:

<action id="org.freedesktop.consolekit.system.stop-multiple-users">
  <description>Stop the system when multiple users are logged in</description>
  <message>System policy prevents stopping the system when other users are logged in</message>
  <defaults>
    <allow_inactive>no</allow_inactive>
    <allow_active>auth_admin_keep</allow_active>
  </defaults>
</action>

, но как-то, с 13.10, эта политика полностью игнорируется. Никто, пока не смог сказать мне, что заменило бы его (во всяком случае.)

Обратите внимание, что у вас также есть такая запись для перезапуска (org.freedesktop.consolekit.system.restart-model-users), которые также должны также быть установлено на auth_admin_keep .

См. Этот вопрос / ответ тоже на Askubuntu: https://shubuntu.com/questions/1190/how-can-i-make-shutdown-ploT-Requirequire-Admin-Passwordword

2
27.01.2020, 19:44

Подсчитайте SSH-соединения, а если больше, чем у вас, то выключение:

SSH_CONS=$(ps x | grep 'sshd:' | grep -v 'grep' | wc -l)

if [ "$SSH_CONS" -gt 1 ]
then
    echo "More than 1 SSH connection..."
else
    echo "Shutting down..."
    # halt
fi

что-то вроде этого?

Я бы, вероятно, вставит некоторые переменные чтения, так что это подскажет мне, как «вы хотите выключить так или иначе?" И "Вы хотите выключить?".

Затем вы можете использовать его как псевдоним или аналогичный.

0
27.01.2020, 19:44

Теги

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