readarray (или канал) проблема

Ожидайте, так в основном Вы хотите к ssh к myhost, затем сразу su базироваться без подсказки пароля, с побочным эффектом вставления пароля root ps вывод для всех на локальном и возможно удаленных машинах для наблюдения?

Да, umm, не делайте этого.

Существует три способа сделать это, что и работа везде и устраняет Ваше раскрытие пароля root (в порядке, я предпочел бы их):

  1. Просто ssh на root@myhost. Используйте аутентификацию с открытым ключом для предотвращения подсказки пароля. Предпочтительно, сохраните свой закрытый ключ зашифрованным (но используйте Агент SSH и/или мультиплексирование соединения для сокращения подсказок пароля). Можно настроить ssh для разрешения корневых логинов с PermitRootLogin yes или только с открытым ключом с PermitRootLogin without-password.
  2. SSH, поскольку Вы в настоящее время, но использование sudo -i вместо su --login. Настройте sudo (через visudo) позволить Вашему некорневому пользователю выполнять все команды как корень (возможно даже без пароля, но затем Ваш некорневой пользователь является корневым эквивалентным с точки зрения безопасности),
  3. Измените свою конфигурацию PAM для создания su не подсказка для пароля от Вашего лица, не использующего своего права. Ваш пользователь является еще раз корневым эквивалентным с точки зрения безопасности.
19
10.06.2014, 02:30
3 ответа

Может быть, попробовать:

unset arr
printf %s\\n a b c | {
    readarray arr
    echo ${#arr[@]}
}

Я ожидаю, что это сработает, но как только вы выйдете из последней { оболочки ; } в конце конвейера | вы потеряете значение переменной. Это связано с тем, что каждый из | отдельных | процессов в конвейере | выполняется в подоболочке ( подоболочка ) . Итак, ваша вещь не работает по той же причине:

( arr=( a b c ) ) ; echo ${arr[@]}

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

15
27.01.2020, 19:44

Для обеспечения выполнения команды readarray в текущей оболочке, либо используйте технологическую замену вместо трубопровода:

readarray arr < <( echo a; echo b; echo c )

, либо (если bash 4. 2 или более поздняя версия) используйте опцию оболочки lastpipe:

shopt -s lastpipe
( echo a; echo b; echo c ) | readarray arr
24
27.01.2020, 19:44

readarray также может читать из stdin, поэтому:

readarray arr <<< "$(echo a; echo b; echo c)"; echo ${#arr[@]}
3
27.01.2020, 19:44

Теги

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