ssh 서버에 로그인하기위한 쉘 스크립트


29

스크립트에 언급 된 비밀번호를 사용하여 ssh 서버에 자동 로그인 할 수있는 쉘 스크립트를 작성하려고했습니다. 다음 코드를 작성했습니다.

set timeout 30
/usr/bin/ssh -p 8484 root@172.31.72.103
expect 
{
   "root@172.31.72.103's password" 
   {
      send "password\r" 
   }
}

이 코드는 제대로 실행되지 않고 여전히 암호를 요구합니다. 누군가이 문제를 해결하는 데 도움을 줄 수 있습니까?



답변:


36

나는 한 번 expectssh 서버에 로그인 하는 스크립트를 작성했으며 (귀하의 경우처럼) 내 스크립트는 다음과 같습니다.

#!/usr/bin/expect

spawn ssh MyUserName@192.168.20.20
expect "password"
send "MyPassword\r"
interact

나는 어쩌면 생각 interact스크립트에 없습니다.


이것은 절대적으로 잘 작동하고 있으며 이곳에 갇혀 있습니다. 상호 작용은 대화식 터미널에 프롬프트를 제공하지만 do cd와 같은 추가 단계를 자동화 ls하고 파일의 내용을 읽으려고합니다. 상호 작용 후 할 수 있습니까? 답장하십시오
Hansiemithun

@Hansie 당신은 ls로그인 후 명령을 보낼 수 있습니다 . 예를 들어, 비밀번호를 보낸 후 expect명령 프롬프트 텍스트를 사용하여 (로그인했는지 확인한 후)을 수행하십시오 send "ls\r". 이 모든 것은 전에 간다 interact.
saeedn

질문이 약간 부정확하고 ls를하고 내용을 읽은 후 죄송합니다. 동일하게 인쇄 할 수 있습니다. 그러나 ssh 세션에서 로컬 시스템에서 액세스하기 위해 변수로 가져 오는 방법. 참조 : stackoverflow.com/questions/32341234/expect-script-return-value . 그러나 출력이 작동하지 않습니다. 내 질문이 게시되었습니다 : stackoverflow.com/questions/51628465/… . file_list종료 후 로컬 명령 프롬프트에서 액세스 해야 합니다
Hansiemithun

31

당신은 그것에 대해 잘못된 길을 가고 있습니다. 당신이하고 싶은 것은 암호가없는 ssh 키 페어를 생성 한 다음 (서버가 RSA 키 인증을 지원하는 한) 암호를 모두 입력하지 않고도 들어갈 수 있습니다. 개인 키를 도난 당할 수있는 곳에 저장하면 보안 상 위험합니다.

이 단계를 따르세요:

  1. mkdir -p ~/.ssh
  2. cd ~/.ssh
  3. ssh-keygen -type dsa -i mysshkeys
  4. Return암호 구를 입력하라는 메시지가 표시되면 누릅니다
  5. 다시 한 번 눌러 Return확인합니다.

지금 거기에 두 개의 파일이있을 것입니다 ~/.ssh디렉토리 mysshkey.pubmysshkey. mysshkey.pub공개 키이며 원격 서버에 안전하게 보관할 수 있습니다. mysshkey암호가 없는 개인 키이므로 원격 서버 (또는 다른 사람이 사본을 얻을 수있는 곳)에 두는 것이 안전 하지 않습니다 .

서버에서 SSH로 연결하려는 경우 :

  1. 원격 서버에 로그인
  2. mkdir -p ~/.ssh
  3. 복사의 내용 붙여 넣기 mysshkey.pub로를~/.ssh/authorized_keys
  4. 있는지 확인 ~/.ssh/authorized_keysIS chmod'D에600

이제 로컬 머신에서 실행하려면 다음 명령을 실행하십시오.

ssh -i ~/.ssh/mysshkey <remote_server_ip>

그리고 비밀번호를 묻지 않고 로그인합니다.

비밀번호를 변경하는 경우 업데이트해야 할 여러 위치에 비밀번호를 하드 코딩하지 않으므로 자동 로그인을 관리하는 것이 좋습니다.


2
DSA 대신 RSA 키를 사용합니다. 그러나 그 외에는 전적으로 동의합니다.
glglgl

12
때로는 네트워크 어플라이언스와 같은 원격 호스트에 키를 추가 할 수 없습니다.
DarkHeart

1
나는 이것을 시도했다. ssh는 여전히 암호를 요구합니다. 구체적으로 IP 주소를 제공해야합니까? <user> @ <domain-name>과 도메인 이름으로 시도했습니다.
Jay Bienvenu 2016 년

이 명령은 너무 많은 주장을 말했습니까? (3 단계)
Joseph Astrahan '

ssh-keygen -t dsa로 변경하고 수동으로 파일 위치를 입력해야했습니다.
Joseph Astrahan '

20

데비안 기반 배포판에서 sshpass패키지는 원하는 것을 쉽게 수행 할 수있는 방법을 제공합니다. 이 패키지는 다른 많은 인기있는 배포판에서 사용할 수 있습니다. 먼저 설정해야합니다.

echo 'YourPassword' > passwordFile.txt
chmod 600 passwordFile.txt

그런 다음 다음과 같은 스크립트에서 SSH 명령을 호출하십시오.

sshpass -f /path/to/passwordFile.txt /usr/bin/ssh -p 8484 root@172.31.72.103

다른 로케일을 사용하거나 비밀번호를 변경해야하는 경우와 같은 솔루션보다 더 많은 유연성을 제공합니다 expect.


7

먼저 sshPass를 설치하십시오 sudo apt-get install sshpass

그런 다음 .bashrc 파일에 다음과 같이 별칭을 만듭니다.

alias sshLogin='sshpass -p <your ssh password> ssh username@remote_host'

이제 변경된 .bashrc 파일을 다음과 같이 다시로드하십시오. source ~/.bashrc

이제 끝났습니다.

이제 sshLogin터미널에서 위에서 만든 별칭 을 사용하여 ssh를 실행할 수 있습니다 .



2

해시 키를 생성하여 PC에 저장하는 데 필요한 모든 것

그냥 입력

ssh-keygen -t rsa -b 4096 # just press Enter till the end

그런 다음 입력

ssh-copy-id <user>@<server>

다음을 사용하여 정상적으로 로그인하십시오

ssh <user>@<server>

이제 비밀번호가 필요 없습니다

참고 : 비밀번호를 일반 텍스트로 저장하면 위험합니다

이 방법은 공개 키 길이가 4096 인 RSA를 사용하여 매우 안전한 비밀번호의 해시 값을 생성합니다.


1
이것은 이 대답 의 반복으로 보인다 .
roaima

#roaima 그렇습니다.하지만 ssh-copy-id다른 사람은 언급하지 않은 매우 유용한 명령을 제안합니다 . 나는 그것을 찬성합니다.
휴 월터스

1

5 단계로 SSH Keygen을 사용하여 SSH 비밀번호없이 로그인 :

환경 설정 : 여기에 이미지 설명을 입력하십시오

1 단계 : SSH-Kegen 키 인증 – – (192.168.0.12)
먼저 사용자로 서버 192.168.0.12에 로그인 한 후 다음 명령을 사용하여 공개 키 쌍을 생성하십시오.

여기에 이미지 설명을 입력하십시오

2 단계 : – 192.168.0.11에
.ssh 디렉토리 작성 다음 명령을 사용하여 서버 192.168.0.12의 SSH를 사용하여 서버 192.168.0.11을 연결하여 그 아래에 .ssh 디렉토리를 작성하십시오.

여기에 이미지 설명을 입력하십시오

3 단계 : 생성 된 공개 키를 – 192.168.0.11에
업로드 서버 192.168.0.12에서 SSH를 사용하고 사용자 .ssh디렉토리 아래의 서버 192.168.0.11에서 새로 생성 된 공개 키 (id_rsa.pub)를 파일 이름 authorized_keys로 업로드하십시오.

여기에 이미지 설명을 입력하십시오

4 단계 : 권한 설정 – 192.168.0.11
서버의 SSH 버전이 다르므로 .ssh디렉토리 및 authorized_keys파일 에 대한 권한을 설정해야 합니다.

여기에 이미지 설명을 입력하십시오

5 단계 : 비밀번호없이 192.168.0.12에서 192.168.0.11로 로그인
이제 비밀번호없이 서버 192.168.0.12의 sheena 사용자로 192.168.0.11에 tecmint 사용자로 로그인 할 수 있습니다.

여기에 이미지 설명을 입력하십시오


고마워 ... 이것은 4 단계를 제외하고는 나를 위해 일했습니다. "경고되지 않은 개인 키 파일! ... ..... / sh / id_rsa '가 너무 열려 있습니다. ... 개인 키는 무시 ... 잘못된 권한 " 내가 그랬어 chmod 700 id_rsa문제가 해결 : 서버 (당신의 예에서 192.168.0.12을 즉 클라이언트) 지역의 디렉토리 스푸핑에
마이크 설치류에게


1

다른 답변에서 이미 설명했듯이 사용 sshpass하지만 read암호를 임시 환경 변수에 저장 하는 명령 과 암호를 결합합니다 . 이런 식으로 내 비밀번호는 어디에도 명확하게 쓰여지지 않습니다. 내가 사용하는 한 줄 명령은 다음과 같습니다.

read -s PASS; sshpass -p $PASS ssh <user>@<host adress>

그런 다음 비밀번호를 입력해야하고 (화면에 아무 것도 나타나지 않음) Enter를 누르면 연결이 열립니다.


0

최근에 이렇게 했으므로 도움이 될 수 있습니다.

sshpass -p 'password' username@ipaddress

이것이 작동하지 않으면 연결하려는 다른 컴퓨터에서 키를 생성해야합니다

ssh-keygen

개인 및 공개 키를 생성하고 위치를 묻고 비워 둡니다. 기본적으로 .ssh 폴더에 키를 저장합니다. 암호를 묻습니다. 비밀로 .ssh 폴더로 이동하여 'authorized_keys'에 공개 키 이름

cd .ssh/
mv id_rsa.pub authorized_keys
useradd -d /home/username username

이것은 목록에 사용자를 추가하여 홈 디렉토리로 이동하고 권한을 부여하고 sshd 서비스를 다시 시작합니다.

chmod 700 /home/username/.ssh
chmod 644 /home/username/.ssh/authorized_keys
chown root:root /home/dozee
sudo service sshd restart

이제 개인 키를 ssh 명령을 실행할 해당 위치의 시스템으로 이동해야합니다.

sshpass -p 'password' ssh -i id_rsa username@ip

그래도 작동하지 않으면 vim 편집기로 sshd_config를 열고 / etc / ssh로 이동하십시오 .pubkeyAuthenticatoin이 yes로 설정되어 있는지 확인하고 yes로 변경하지 않으면 sshd 서비스를 다시 시작한 다음 시도하십시오. .


0

첫 번째 인수는 호스트 이름이고 두 번째 인수는 비밀번호입니다.

     #!/usr/bin/expect
     set pass [lindex $argv 1]
     set host [lindex $argv 0]
     spawn ssh -t root@$host echo Hello
     expect "*assword: "
     send "$pass\n";
     interact

실행 : ./script.expect

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.