
Я бежал eval `ssh-agent -s\`
и получаю эту ошибку
fish: Unknown command: `ssh-agent
решение1
Ваш вопрос состоит из двух частей:
- Почему при попытке возникает ошибка
eval `ssh-agent -s`
? - Как включить
ssh-agent
в оболочке Fish
Для первого, функция, которую вы ищете, называется "подстановка команд". Есть два способа сделать это в оболочках Bash/POSIX:
- Обратные кавычки (например
`command`
, ), как вы используете $(command)
Использование обратных кавычек крайне не рекомендуется, поэтому, если вы натыкаетесь на документацию или блог, использующие их, знайте, что они сильно устарели (или не известны).
В Fish, как вы обнаружили, (command)
группировка является "наиболее поддерживаемым" способом подстановки команд. Однако, начиная с Fish 3.4.0, эта $(command)
форма также работает. Поэтому используйте либо:
eval (ssh-agent -c)
илиeval $(ssh-agent -c)
будет работать
Как запустить ssh-agent в Fish Shell?
Однако я бы рекомендовал использоватьkeychain
для упрощения ssh-agent
использования в Fish (и других оболочках). Не обращайте внимания на часть веб-страницы, которая говорит (как @Charliesneath указывает в комментариях),«В настоящее время брелок несовместим с Fish Shell». Веб-страница просто давно не обновлялась.
На самом деле Keychain имеет встроенную поддержку Fish (добавленную в 2017 году) и может использовать универсальные переменные для синхронизации ключей между несколькими сеансами оболочки.
Например, если у вас открыты две сессии оболочки Fish и вы запускаете ssh-agent
/ ssh-add
в одной из них, вам все равно нужно запустить то же самое в другой и снова ввести пароль. Естьспособы совместного использования агента между сеансами оболочки, но Keychain сделает это за вас.
Keychain можно установить напрямую из репозиториев большинства дистрибутивов. Например, sudo apt install keychain
.
Его можно включить в Fish с помощью:
keychain --eval <keyfile> | source
Я настроил это в Fish следующим образом.
Создайте следующий скрипт в
~/.config/fish/conf.d/keychain.fish
if status is-login and status is-interactive # To add a key, set -Ua SSH_KEYS_TO_AUTOLOAD keypath # To remove a key, set -U --erase SSH_KEYS_TO_AUTOLOAD[index_of_key] keychain --eval $SSH_KEYS_TO_AUTOLOAD | source end
set -Ua SSH_KEYS_TO_AUTOLOAD ~/.ssh/id...
для любого ключа(ей), который вы хотите использовать.
Вот и все. Когда вы запускаете оболочку Fish для входа, если ключ не разблокирован, Keychain запросит пароль и добавит его в общий ssh-agent
. Если он уже разблокирован, то он не будет спрашивать снова.
Конечно, вы можете упростить скрипт, встроив статические имена ключей. Я предпочитаю универсальные переменные, чтобы сохранить динамичность скрипта. Это позволяет хранить один скрипт в моем репозитории dotfiles, даже если я использую разные ключи в разных системах.
решение2
Я понимаю это решение
бегать
eval (ssh-agent -c)
ссылка:https://wiki.archlinux.org/title/Fish#Evaluate_ssh-agent
решение3
Я использую fish_ssh_agent
от gihubhttps://github.com/ivakyb/fish_ssh_agent
В этом репозитории также есть несколько ценных советов по теме SSH, SSH-agent, Fish-shell.