OpenSSH ssh
클라이언트에 자동으로 비밀번호를 입력하는 스크립트를 작성해야합니다 .
myname@somehost
비밀번호 를 사용하여 SSH로 연결해야한다고 가정 해 봅시다 a1234b
.
이미 시도했습니다 ...
#~/bin/myssh.sh
ssh myname@somehost
a1234b
...하지만 작동하지 않습니다.
이 기능을 스크립트로 가져 오려면 어떻게해야합니까?
OpenSSH ssh
클라이언트에 자동으로 비밀번호를 입력하는 스크립트를 작성해야합니다 .
myname@somehost
비밀번호 를 사용하여 SSH로 연결해야한다고 가정 해 봅시다 a1234b
.
이미 시도했습니다 ...
#~/bin/myssh.sh
ssh myname@somehost
a1234b
...하지만 작동하지 않습니다.
이 기능을 스크립트로 가져 오려면 어떻게해야합니까?
답변:
먼저 sshpass 를 설치해야합니다 .
apt-get install sshpass
yum install sshpass
pacman -S sshpass
예:
sshpass -p "YOUR_PASSWORD" ssh -o StrictHostKeyChecking=no YOUR_USERNAME@SOME_SITE.COM
맞춤 포트 예 :
sshpass -p "YOUR_PASSWORD" ssh -o StrictHostKeyChecking=no YOUR_USERNAME@SOME_SITE.COM:2400
노트:
sshpass
-f
플래그가 전달 될 때 파일에서 암호를 읽을 수도 있습니다 .
-f
하면 ps
명령이 실행될 때 비밀번호가 표시되지 않습니다 .ps -aux
같은 컴퓨터의 다른 사용자가 암호를 볼 수 있기 때문에 암호를 입력하여 명령을 실행하면 안됩니다 ps -aux
. 가능하다면 다른 답변에서 언급했듯이 공개 키 인증을 대신 사용하려고합니다. 이렇게하면 인증 정보를 스크립트와 분리하여 스크립트를 걱정없이 다른 사람들과 공유 할 수 있으며 나중에 스크립트를 암호화하지 않고도 ~ / .ssh 폴더에서 암호화를 활성화 할 수 있습니다.
sshpass
추가했습니다 .
몇 달 동안 질문에 대한 답을 찾은 후 마침내 더 나은 해결책을 찾았습니다. 간단한 스크립트 작성.
#!/usr/bin/expect
set timeout 20
set cmd [lrange $argv 1 end]
set password [lindex $argv 0]
eval spawn $cmd
expect "assword:"
send "$password\r";
interact
에 넣으면 /usr/bin/exp
다음을 사용할 수 있습니다.
exp <password> ssh <anything>
exp <password> scp <anysrc> <anydst>
끝난!
공개 키 인증 사용 : https://help.ubuntu.com/community/SSH/OpenSSH/Keys
소스 호스트에서 이것을 한 번만 실행하십시오.
ssh-keygen -t rsa # ENTER to every field
ssh-copy-id myname@somehost
그 후에는 비밀번호없이 ssh를 수행 할 수 있습니다.
expects 스크립트를 사용할 수 있습니다. 나는 꽤 오랫동안 글을 쓰지 않았지만 아래와 같이 보일 것입니다. 스크립트를 사용하여#!/usr/bin/expect
#!/usr/bin/expect -f
spawn ssh HOSTNAME
expect "login:"
send "username\r"
expect "Password:"
send "password\r"
interact
/bin/myssh.sh: 2: spawn: not found /bin/myssh.sh: 3: expect: not found /bin/myssh.sh: 4: send: not found /bin/myssh.sh: 5: expect: not found /bin/myssh.sh: 6: send: not found
which expect
#!/usr/bin/env expect
interact
ssh 세션이 실제로 대화식이되도록 끝에 추가 했습니다
변형 I
sshpass -p PASSWORD ssh USER@SERVER
변형 II
#!/usr/bin/expect -f
spawn ssh USERNAME@SERVER "touch /home/user/ssh_example"
expect "assword:"
send "PASSWORD\r"
interact
-p
플래그는 포트 번호를 지정하기위한 것입니다.
SYNOPSIS sshpass [-ffilename|-dnum|-ppassword|-e] [options] command arguments
yum -y install epel-release
다음과yum -y install sshpass
이미 언급 한 것의 한 가지 좋은 보너스는와 sshpass
함께 사용할 수 autossh
있어 대화식 비 효율성을 더 많이 제거 한다는 것입니다 .
sshpass -p mypassword autossh -M0 -t myusername@myserver.mydomain.com
예를 들어 랩톱을 닫아서 Wi-Fi가 중단 된 경우 자동 재 연결이 가능합니다.
-f
when used with autossh, ssh will be *unable* to ask for passwords or passphrases.
sshpass
더 나은 보안나는이 스레드를 우연히 발견하여 보그 다운 된 서버로 ssh하는 방법을 찾았습니다 .SSH 연결 시도를 처리하는 데 1 분이 걸렸으며 암호를 입력하기 전에 시간이 초과되었습니다. 이 경우 프롬프트가 표시되면 즉시 비밀번호를 제공 할 수 있기를 원했습니다 .
서버가이 상태 인 경우 공개 키 로그인을 설정하기에는 너무 늦습니다.
sshpass
구조에. 그러나 이것보다 더 좋은 방법이 sshpass -p
있습니다.
내 구현은 대화 형 암호 프롬프트로 직접 건너 뛰고 (공개 키 교환이 가능한지 시간을 낭비하지 않음) 암호를 일반 텍스트로 표시하지 않습니다.
#!/bin/sh
# preempt-ssh.sh
# usage: same arguments that you'd pass to ssh normally
echo "You're going to run (with our additions) ssh $@"
# Read password interactively and save it to the environment
read -s -p "Password to use: " SSHPASS
export SSHPASS
# have sshpass load the password from the environment, and skip public key auth
# all other args come directly from the input
sshpass -e ssh -o PreferredAuthentications=keyboard-interactive -o PubkeyAuthentication=no "$@"
# clear the exported variable containing the password
unset SSHPASS
trap
ctrl-C가 SSHPASS
변수 를 유출하지 못하도록 스크립트 업데이트
PreferredAuthentications=keyboard-interactive
그것이 PreferredAuthentications=password
효과가 없지만 그것을 대체하는 것으로 나타났습니다 .
# create a file that echo's out your password .. you may need to get crazy with escape chars or for extra credit put ASCII in your password...
echo "echo YerPasswordhere" > /tmp/1
chmod 777 /tmp/1
# sets some vars for ssh to play nice with something to do with GUI but here we are using it to pass creds.
export SSH_ASKPASS="/tmp/1"
export DISPLAY=YOURDOINGITWRONG
setsid ssh root@owned.com -p 22
나는 누군가가 이것을 제안하는 것을 보지 못하고 OP는 방금 "스크립트"라고 말했습니다.
나는 같은 문제를 해결해야했고 가장 편안한 언어는 Python입니다.
나는 paramiko 라이브러리를 사용했습니다. 또한을 사용하여 에스컬레이션 된 권한이 필요한 명령을 실행해야했습니다 sudo
. sudo는 "-S"플래그를 통해 stdin을 통해 비밀번호를 수락 할 수 있습니다! 아래를보십시오 :
import paramiko
ssh_client = paramiko.SSHClient()
# To avoid an "unknown hosts" error. Solve this differently if you must...
ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# This mechanism uses a private key.
pkey = paramiko.RSAKey.from_private_key_file(PKEY_PATH)
# This mechanism uses a password.
# Get it from cli args or a file or hard code it, whatever works best for you
password = "password"
ssh_client.connect(hostname="my.host.name.com",
username="username",
# Uncomment one of the following...
# password=password
# pkey=pkey
)
# do something restricted
# If you don't need escalated permissions, omit everything before "mkdir"
command = "echo {} | sudo -S mkdir /var/log/test_dir 2>/dev/null".format(password)
# In order to inspect the exit code
# you need go under paramiko's hood a bit
# rather than just using "ssh_client.exec_command()"
chan = ssh_client.get_transport().open_session()
chan.exec_command(command)
exit_status = chan.recv_exit_status()
if exit_status != 0:
stderr = chan.recv_stderr(5000)
# Note that sudo's "-S" flag will send the password prompt to stderr
# so you will see that string here too, as well as the actual error.
# It was because of this behavior that we needed access to the exit code
# to assert success.
logger.error("Uh oh")
logger.error(stderr)
else:
logger.info("Successful!")
이것이 누군가를 돕기를 바랍니다. 내 유스 케이스는 한 번에 ~ 300 서버에서 디렉토리를 작성하고 파일을 보내거나 untarring하고 프로그램을 시작하는 것이었다. 따라서 자동화가 가장 중요했습니다. 나는 시도 sshpass
, expect
다음이 함께했다.
나는 다음과 같이 작동했다.
.ssh / config가 yes / no 프롬프트를 제거하도록 수정되었습니다. 방화벽 뒤에있어 스푸핑 된 ssh 키에 대해 걱정하지 않습니다.
host *
StrictHostKeyChecking no
응답에 대한 응답 파일을 작성하십시오 (예 : answer.expect).
set timeout 20
set node [lindex $argv 0]
spawn ssh root@node service hadoop-hdfs-datanode restart
expect "*?assword {
send "password\r" <- your password here.
interact
bash 스크립트를 만들고 파일에서 expect를 호출하십시오.
#!/bin/bash
i=1
while [$i -lt 129] # a few nodes here
expect answer.expect hadoopslave$i
i=[$i + 1]
sleep 5
done
hadoop / conf 파일에 NFS 마운트를 사용한다고 가정하면 새로운 구성으로 128 hadoop 데이터 노드를 새로 고칩니다.
이것이 누군가에게 도움이되기를 바랍니다-나는 Windows numpty이고 이것은 알아내는 데 약 5 시간이 걸렸습니다!
Windows 시스템에서이 작업을 수행하는 경우 Plink (PuTY의 일부)를 사용할 수 있습니다.
plink your_username@yourhost -pw your_password
루트 사용자로 변경하는 것보다 계정에 로그인하는 것이 더 나은 솔루션이 있습니다. bash 스크립트입니다
http://felipeferreira.net/index.php/2011/09/ssh-automatic-login/
@abbotto의 대답은 저에게 효과가 없었으며 다른 일을해야했습니다.
다음 예제에서는 내가 사용한 솔루션을 작성합니다.
시나리오 : sh 스크립트를 사용하여 서버에서 파일을 복사하고 싶습니다.
#!/usr/bin/expect
$PASSWORD=password
my_script=$(expect -c "spawn scp userName@server-name:path/file.txt /home/Amine/Bureau/trash/test/
expect \"password:\"
send \"$PASSWORD\r\"
expect \"#\"
send \"exit \r\"
")
echo "$my_script"
스크립트 내에서이 스크립트를 사용하십시오. 첫 번째 인수는 호스트 이름이고 두 번째는 비밀번호입니다.
#!/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"
쉘 스크립트를 통해 원격 컴퓨터를 연결하려면 아래 명령을 사용하십시오.
sshpass -p PASSWORD ssh -o StrictHostKeyChecking=no USERNAME@IPADDRESS
여기서 IPADDRESS
, USERNAME
및 PASSWORD
스크립트에 제공 할 필요가 입력 값은, 또는 우리가 런타임 사용에 제공하려는 경우 명령을 "읽기".
StrictHostKeyChecking=no
결과를 설명하지 않고 사용하도록 제안하지 마십시오 .