쉘 스크립트에서 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.