Я могу сделать ssh и сделать для цикла и коснуться файлов в единственном выстреле?

Если Вы хотите протестировать, выполнялась ли текущая оболочка su:

[ "$(ps -o comm= $PPID)" = "su" ]

Если Вы хотите протестировать ли позвонивший пользователь su начиная с входа в систему затем на многих (но не все) системы можно выдержать сравнение LOGNAME (обычно установленный при начальном входе в систему) с USER или id -un (который идентифицирует текущего пользователя). Отметьте это LOGNAME тривиально spoofable (это - переменная среды). Но затем, так другие решения (например, ln -s /bin/su ~/sh; ~/sh скроется su из любого решения на основе имен процесса).

3
28.02.2012, 11:57
3 ответа

ssh позволяет Вам выполнять несколько команд. Просто разделите каждую команду с точкой с запятой.

command=": "
for account in ${accounts}
do
        command=$command"; touch EVENTS_${account}_${date}.log"
done
ssh -q id@server "$command"

Весь ":" делает, говорит, "продолжаются к следующей команде". Это так, Вы не запускаете свою команду с точки с запятой.

Кроме того, Вам не нужны обратные галочки вокруг той команды.

3
27.01.2020, 21:24

Выполните цикл на удаленной машине.

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
0
27.01.2020, 21:24
  • 1
    Это немного более хитро, потому что необходимо выйти из '$'. touch EVENTS_\${account}_${date}.log должен работать, если $ {дата} определяется в системе, звоня ssh во-первых. Выход предотвращает $ {учетная запись} от того, чтобы быть интерпретируемым локально. –  Chris Betti 28.02.2012, 04:59

Кластер ssh походит на идеальный инструмент для того, что Вы пытаетесь сделать.

ClusterSSH является инструментом для внесения того же изменения на нескольких серверах одновременно. Команда 'cssh' открывает консоль администрирования и xterm ко всем указанным хостам. Любой текст, введенный в консоль администрирования, копируется во все окна. Все окна могут также быть введены в непосредственно.

Этот инструмент предназначен для (но не ограничен), кластерное администрирование, куда та же конфигурация или команды должны быть выполнены на каждом узле в кластере. Выполнение этих команд внезапно через этот инструмент гарантирует, что все узлы сохранены в синхронизации.

0
27.01.2020, 21:24

Теги

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