Можно ли использовать «su -c» с несколькими командами, но в одном сеансе?

Я пытаюсь запустить следующие две команды в одной команде.

eval "$(ssh-agent)"
ssh add ~/.ssh/id_rsa

Я пробовал со многими возможными решениями:

su username -c "{ eval $(ssh-agent -s) }; ssh-add ~/.ssh/id_rsa"
su username -c "eval $(ssh-agent -s)" ; ssh-add ~/.ssh/id_rsa
su username -c "eval $(ssh-agent -s)" && ssh-add ~/.ssh/id_rsa
su username -c "eval $(ssh-agent -s)" && "ssh-add ~/.ssh/id_rsa"

Похоже, что первая команда выполняется успешно, но вторая либо отвечает сообщением об отказе в доступе (означает, что она выполняется с текущим пользователем), либо не может подключиться к агенту аутентификации (означает, что он, вероятно, создал новый сеанс для второй команды).

Сообщения об ошибках:

Could not open a connection to your authentication agent.
Error connecting to agent: Permission denied

Если я запускаю их отдельно по порядку, все работает:///

Цель состоит в том, чтобы создать скрипт bash с этими командами с переменными, примерно так:

folder=/home/q12
username=q12

su $username -c "{ eval $(ssh-agent -s) }; ssh-add $folder/.ssh/id_rsa"

Из-за переменных я не могу цитировать всю команду, потому что она будет чувствительна к ";" и "&&".

Кто-нибудь может мне с этим помочь? Спасибо!

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
64
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вам нужны одинарные кавычки. В противном случае подстановка команды оценивается в текущем контексте.

su username -c 'eval "$(ssh-agent -s)"; ssh-add ~/.ssh/id_rsa'

Редактировать:

Чтобы получить условное выполнение ssh-add, вы можете сделать:

su username -c 'script=$(ssh-agent -s) || exit 1; eval "$script"; ssh-add ~/.ssh/id_rsa'
# or
su username -c 'set -e; script=$(ssh-agent -s); eval "$script"; ssh-add ~/.ssh/id_rsa'

Аргумент в su -c STRING — это командная строка, похожая на bash -c STRING. Мы также можем вкладывать двойные кавычки в одинарные кавычки.

Оно работает! Спасибо! Я попробовал это, но с переменной внутри. В любом случае, я могу оставить эту переменную... Еще раз большое спасибо!

SnackK0515 05.11.2022 01:33

Первая из ваших попыток ближе всего, но внутри двойных кавычек такие вещи, как $(ssh-agent -s), оцениваются вашей оболочкой, прежде чем они будут переданы su как часть аргумента. Чистый результат: агент ssh работает под текущим пользователем, поэтому другой пользователь не может его использовать.

Вам нужно отложить оценку до появления оболочки другого пользователя. Это можно сделать с помощью одинарных кавычек вместо двойных, но в фактической команде у вас есть $folder, которую вы явно хотите оценить в своей оболочке (она не будет определена в оболочке другого пользователя), поэтому вы не хотите отложить оценку этого. Самый простой способ сделать это - экранировать $, оценку которого вы хотите отложить (ваша оболочка удалит экранирование, поэтому оболочка другого пользователя увидит и оценит его):

su "$username" -c "eval \$(ssh-agent -s); ssh-add $folder/.ssh/id_rsa"
#                       ^ Note the escape

(Кстати, я также добавил двойные кавычки вокруг имени пользователя, так как в целом это хорошая гигиена сценариев. Цитирование $folder более сложное, и в нем нет необходимости, если оно не содержит каких-либо странных символов, поэтому я пропустил его. Кроме того, { } не были необходимы, и если они использовались, перед ; должен был быть }... поэтому я просто удалил их.)

Другой вариант — заключить часть команды в одинарные кавычки, а другую — в двойные (смешанные кавычки выглядят странно, но вполне допустимы в синтаксисе оболочки):

    su "$username" -c 'eval $(ssh-agent -s);'" ssh-add $folder/.ssh/id_rsa"
#                     ^  single-quoted part ^^    double-quoted part      ^

Причина, по которой остальные ваши попытки не сработали, заключается в том, что разделитель между командами (; или &&) не был в строке в кавычках и, следовательно, интерпретировался вашей оболочкой как разделитель, поэтому вторая команда была запущена под вашим идентификатор пользователя, а не как часть команды su.

По какой-то причине я получил следующее сообщение об ошибке с вашими методами: sh: 1: Синтаксическая ошибка: "(" неожиданно (ожидание "}")

SnackK0515 07.11.2022 08:11

@ SnackK0515 Ой, перед } не хватало точки с запятой. На самом деле, { } не делали ничего полезного, поэтому я просто удалил их. Попробуй это сейчас. Хотя это не то сообщение об ошибке, которое я ожидал, так что может быть что-то еще. Если удаление { } не помогло, попробуйте заменить su "$username" -c только на echo и посмотрите, правильно ли выглядит полученная команда.

Gordon Davisson 07.11.2022 11:40

Другие вопросы по теме