Я пытаюсь запустить следующие две команды в одной команде.
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"
Из-за переменных я не могу цитировать всю команду, потому что она будет чувствительна к ";" и "&&".
Кто-нибудь может мне с этим помочь? Спасибо!
Вам нужны одинарные кавычки. В противном случае подстановка команды оценивается в текущем контексте.
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
. Мы также можем вкладывать двойные кавычки в одинарные кавычки.
Первая из ваших попыток ближе всего, но внутри двойных кавычек такие вещи, как $(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 Ой, перед }
не хватало точки с запятой. На самом деле, { }
не делали ничего полезного, поэтому я просто удалил их. Попробуй это сейчас. Хотя это не то сообщение об ошибке, которое я ожидал, так что может быть что-то еще. Если удаление { }
не помогло, попробуйте заменить su "$username" -c
только на echo
и посмотрите, правильно ли выглядит полученная команда.
Оно работает! Спасибо! Я попробовал это, но с переменной внутри. В любом случае, я могу оставить эту переменную... Еще раз большое спасибо!