Если Вы хотите протестировать, выполнялась ли текущая оболочка su
:
[ "$(ps -o comm= $PPID)" = "su" ]
Если Вы хотите протестировать ли позвонивший пользователь su
начиная с входа в систему затем на многих (но не все) системы можно выдержать сравнение LOGNAME
(обычно установленный при начальном входе в систему) с USER
или id -un
(который идентифицирует текущего пользователя). Отметьте это LOGNAME
тривиально spoofable (это - переменная среды). Но затем, так другие решения (например, ln -s /bin/su ~/sh; ~/sh
скроется su
из любого решения на основе имен процесса).
ssh позволяет Вам выполнять несколько команд. Просто разделите каждую команду с точкой с запятой.
command=": "
for account in ${accounts}
do
command=$command"; touch EVENTS_${account}_${date}.log"
done
ssh -q id@server "$command"
Весь ":" делает, говорит, "продолжаются к следующей команде". Это так, Вы не запускаете свою команду с точки с запятой.
Кроме того, Вам не нужны обратные галочки вокруг той команды.
Выполните цикл на удаленной машине.
ssh -q id@server "for account in ${accounts}; do touch EVENTS_\${account}_${date}.log; done"
Обратите внимание, что я принимаю это $accounts
и $date
не содержите специальные символы оболочки ("$'()&;<>[\]`{|}~
). В paricular, $accounts
будет интерполирован в удаленную оболочку, затем интерпретируемую там. Если необходимо защитить специальные символы, необходимо быть более осторожными с заключением в кавычки:
q=\'\\\'\' # '\'' effectively quotes a single quote inside single quotes
ssh -q id@server 'for account in '\'"${accounts//\'/$q}"\''; do touch "EVENTS_${account}_${date}.log"; done'
С другой стороны, смонтируйте удаленную файловую систему с sshfs и работой над ним, как Вы были бы локально.
mkdir mnt
sshfs id@server mnt
for account in ${accounts}; do touch "mnt/EVENTS_\${account}_${date}.log"; done
touch EVENTS_\${account}_${date}.log
должен работать, если $ {дата} определяется в системе, звоня ssh во-первых. Выход предотвращает $ {учетная запись} от того, чтобы быть интерпретируемым локально.
– Chris Betti
28.02.2012, 04:59
Кластер ssh походит на идеальный инструмент для того, что Вы пытаетесь сделать.
ClusterSSH является инструментом для внесения того же изменения на нескольких серверах одновременно. Команда 'cssh' открывает консоль администрирования и xterm ко всем указанным хостам. Любой текст, введенный в консоль администрирования, копируется во все окна. Все окна могут также быть введены в непосредственно.
Этот инструмент предназначен для (но не ограничен), кластерное администрирование, куда та же конфигурация или команды должны быть выполнены на каждом узле в кластере. Выполнение этих команд внезапно через этот инструмент гарантирует, что все узлы сохранены в синхронизации.