쉘 스크립트에서 ssh-agent 실행


19

ssh-agent를 시작하고 개인 키를 에이전트에 추가하는 쉘 스크립트를 작성하려고합니다. 예:

#!/bin/bash
# ...
ssh-agent $SHELL
ssh-add /path/to/key
# ...

이것에 대한 문제는 ssh-agent가 분명히 $ SHELL의 다른 인스턴스 (내 경우에는 bash)를 시작하고 스크립트의 관점에서 모든 것을 실행하고 ssh-add를 수행하며 그 아래의 것은 실행되지 않습니다.

쉘 스크립트에서 ssh-agent를 어떻게 실행하고 명령 목록 아래로 계속 이동할 수 있습니까?

답변:


8

ssh-agent는 세션을 시작하고 완료되면 사용자 세션이 종료됩니다. 따라서 ssh-agent 이후의 모든 명령은 로그 오프 후에 실행될 수 있습니다.

원하는 것은 다음 session-script과 같은 세션 명령을 포함 하는 것 입니다.

#!/bin/bash
ssh-add /path/to/key
bash -i # or other session starter

그런 다음 시작하십시오 ssh-agent session-script.


감사! 별도의 스크립트를 작성하고 스크립트를 끝내는 exit것이 트릭입니다.
— Dan

2
세션 스크립트 란 무엇입니까?
— Alexander Mills

15

스크립트 상단에 다음을 입력하십시오.

eval `ssh-agent`

스크립트는 다음과 같아야합니다.

#!/bin/bash
eval `ssh-agent`
ssh-add /path/to/key
...
...

설명

주변의 백틱 ssh-agent은 출력을 수집합니다. eval출력을 수집하여 단일 명령으로 연결 한 다음 명령을 실행합니다. 그런 다음 ssh-add키 자격 증명을 제공 하는 데 사용할 수 있습니다 .


9
백틱이 나오고 있음을 지적 할 가치가 있지만 이것이 바로 내가 필요한 것입니다. 새로운 배쉬 형식에서eval $(ssh-agent)
— sibaz

이 솔루션은 bash -i스크립트 끝에 넣을 때까지 작동하지 않았습니다 .
— Adolfo Correa

6

에이전트가 필요한 스크립트에서 이와 같은 작업을 수행하는 경향이 있습니다.

#!/bin/bash

# if we can't find an agent, start one, and restart the script.
if [ -z "$SSH_AUTH_SOCK" ] ; then
  exec ssh-agent bash -c "ssh-add ; $0"
  exit
fi

... and so on.

기본적으로 스크립트가 가장 먼저 수행하는 것은 에이전트가 실행 중인지 확인합니다. 실행되지 않으면 스크립트 대신 새 프로세스를 시작하는 데 사용됩니다. 에이전트가 시작되고 키가 추가 된 후 마지막으로 스크립트가 다시 호출됩니다 (참조 $0).


그러나 스크립트 매개 변수는 유지되지 않습니다. 그리고 매개 변수 중 하나에 공백이 있으면 쉽게 전달할 수 없습니다.
— Denilson Sá Maia

3
을 사용 .. "ssh-add ; $0 $*"하거나 .. "ssh-add ; $0 $@"대신 사용할 수 있습니다. 완벽하지는 않지만 많은 경우에 확실히 작동합니다. 가장 좋은 해결책은 거의 항상 에이전트를 다른 어떤 것보다 먼저 실행하는 것입니다. 이것은 모호한 경우에 유용 할 수 있습니다.
— Zoredache

6

나는 이것이 나를 위해 일한다는 것을 알았다.

eval `ssh-agent` # create the process
ssh-add ~/.ssh/priv_key # add the key
git -C $repo_dir pull # this line is the reason for the ssh-agent
eval `ssh-agent -k` # kill the process

ssh-agent 프로세스를 작성하고 키를 추가하고 필요한 작업을 수행 한 다음 종료하십시오. 나중에 실행 중인지 확인할 필요가 없습니다.


4

이 경우 키 체인 을 사용하는 것이 좋습니다

데비안 / 우분투 :

apt-get install keychain

RHEL / 페도라 / CentOS

yum install keychain

.bashrc에 다음을 추가하십시오.

eval `keychain --eval id_rsa`

보다 나은? 왜 더 낫습니까?
— JFlo

@JFlo "더 나은"환경 변수를 $ HOME / .keychain / <file>에 저장합니다. 해당 명령을 다시 실행하면 기존 ssh-agent가 여전히 실행중인 경우이를 픽업합니다. 그런 다음 쉘 / 스크립트간에 재사용 할 수 있습니다. 안전하지 않은 일부 시나리오에서는 전화를 걸어야합니다. 저에게는 동일한 작업을 수행하기 위해 작성한 일부 스크립트에 비해 개선 된 것입니다
— Scott Carlson

2

Zoredache의 솔루션을 사용하면 스크립트를 호출 한 쉘과 동일한 ssh 에이전트를 공유하는 모든 쉘에서 키를 사용할 수 있습니다. 명백한 보안상의 이유로 원격 컴퓨터에 대한 루트 액세스가 필요한 스크립트에서는 이것을 피하고 싶었습니다.

스크립트 작업의 맨 위에 다음 shebang을 넣는 것을 발견했습니다.

#!/usr/bin/ssh-agent bash

ssh-add /path/to/ssh-key
ssh root@remotehost "remote commands"

-2

나는 많은 시도를했고 마침내 효과가 있었던 해결책은 암호를 빈 문자열로 바꾸는 것이 었습니다.

ssh-keygen -p

이것은 매우 안전하지 않은 방법입니다. 왜 ssh를 전혀 사용하지 않습니까? 개인 키를 보호하지 않으면 일반 텍스트로 대화 할 수도 있습니다.
— JFlo

@JFlo : 클라이언트 시스템이 충분히 안전하지 않다면 아닙니다. 특히 ACL, SELinux 또는 이와 유사한 것을 추가 할 수 있다면 정적 파일에서는 쉽지만 ssh-agent의 무작위 소켓에서는 그렇지 않습니다. 그것은 일반적으로 첫 번째 선택으로 권장하지 않을 것이라고 말했다.
— dave_thompson_085

그것은 당신이 제공하는 매우 유용한 과정이지만 OP의 질문에 대해서는 아무것도 대답하지 않는다고 생각합니다.
— Alexander Bird
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.