Ваше заключение в кавычки является неправильным. Когда Вы пишете $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
.
Я записал бы небольшую программу, которая проверила на любые активные соединения 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
Вы на самом деле нашли нужную информацию. По крайней мере, он работал под 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
Подсчитайте 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
что-то вроде этого?
Я бы, вероятно, вставит некоторые переменные чтения, так что это подскажет мне, как «вы хотите выключить так или иначе?" И "Вы хотите выключить?".
Затем вы можете использовать его как псевдоним или аналогичный.
session
цепочка с программой, которая касается файла, когда пользователь регистрирует на пути SSH и удаляет его, когда пользователь выходит из системы и затем имеет программу, Вы предложили просто проверку на существование этих файлов. Если это работает, я принимаю Ваш ответ. – Joseph R. 28.02.2013, 20:01who
вместо этого. Это показывает, какой пользователь (пользователи) соединен и от который хост. – Joseph R. 28.02.2013, 20:31who
не дает очень вывод, но большинство других оболочек, которые он делает. (Глупая встроенная система...) В любом случае, если Вы хотите использоватьnetstat
, довольно просто получить столбец, с которым Вы нуждаетесьawk
. Что-то вродеnetstat -a | awk '{print $4}'
(По крайней мере, на моей оболочке.) – kmort 28.02.2013, 20:50