我需要创建一个自动向OpenSSH ssh
客户端输入密码的脚本。
假设我需要使用密码myname@somehost
通过SSH连接到a1234b
。
我已经尝试过了......
#~/bin/myssh.sh
ssh myname@somehost
a1234b
......但这不起作用。
如何将此功能添加到脚本中?
答案 0 :(得分:231)
首先,您需要安装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
可防止密码可见。答案 1 :(得分:79)
在寻找问题答案数月之后,我终于找到了一个更好的解决方案:编写一个简单的脚本。
#!/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>
完成!
答案 2 :(得分:64)
使用公钥身份验证:https://help.ubuntu.com/community/SSH/OpenSSH/Keys
在源主机中只运行一次:
ssh-keygen -t rsa # ENTER to every field
ssh-copy-id myname@somehost
这就是全部,之后你就可以在没有密码的情况下进行ssh。
答案 3 :(得分:26)
您可以使用expect脚本。我在相当长的一段时间内没有写过,但它应该如下所示。您需要使用#!/usr/bin/expect
#!/usr/bin/expect -f
spawn ssh HOSTNAME
expect "login:"
send "username\r"
expect "Password:"
send "password\r"
interact
答案 4 :(得分:19)
变体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
答案 5 :(得分:7)
已经提到的sshpass
的一个好处是你可以将它与autossh
一起使用,从而消除更多的交互效率低下。
sshpass -p mypassword autossh -M0 -t myusername@myserver.mydomain.com
这将允许自动重新连接,例如,关闭笔记本电脑会打断你的wifi。
答案 6 :(得分:7)
sshpass
具有更好的安全性我偶然发现了这个线程,同时寻找一种方法来进入陷入困境的服务器 - 它花了一分多钟来处理SSH连接尝试,并在我输入密码之前超时。在这种情况下,我希望能够在提示可用时立即提供我的密码 。
(如果不是很清楚:如果服务器处于此状态,则设置公钥登录为时已晚。)
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
答案 7 :(得分:6)
# 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
答案 8 :(得分:4)
我认为我没有看到有人建议这样做,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台服务器上启动程序。因此,自动化至关重要。我尝试过sshpass,并期望然后想到这个。
我希望它能像我一样对某人有所帮助!
答案 9 :(得分:4)
我正在使用以下解决方案,但为此您必须安装sshpass
(如果尚未安装),请使用sudo apt install sshpass
现在您可以这样做,
sshpass -p *YourPassword* shh root@IP
您也可以创建一个bash别名,这样就不必一次又一次地运行整个命令。 请按照以下步骤操作
cd ~
sudo nano .bash_profile
在文件末尾添加以下代码
mymachine() { sshpass -p *YourPassword* shh root@IP }
source .bash_profile
现在只需从终端运行mymachine
命令,您将无需密码提示即可输入计算机。
注意:
mymachine
可以是您选择的任何命令。答案 10 :(得分:2)
如果在Windows系统上执行此操作,则可以使用Plink(PuTTY的一部分)。
plink your_username@yourhost -pw your_password
答案 11 :(得分:1)
@abbotto的答案对我不起作用,不得不做一些不同的事情:
答案 12 :(得分:1)
我有一个更好的解决方案,包括使用您的帐户登录,而不是更改为root用户。 这是一个bash脚本
http://felipeferreira.net/index.php/2011/09/ssh-automatic-login/
答案 13 :(得分:1)
我按照以下方式工作
.ssh / config被修改以消除是/否提示 - 我在防火墙后面,所以我不担心欺骗性的ssh密钥
host *
StrictHostKeyChecking no
为expect创建一个响应文件,即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
使用新配置刷新128个hadoop datanode - 假设您正在为hadoop / conf文件使用NFS挂载
希望这有助于某人 - 我是一个Windows numpty,这花了我大约5个小时才弄明白!
答案 14 :(得分:1)
这基本上是abbotto答案的扩展,它有一些额外的步骤(针对初学者),可以很容易地从linux主机启动服务器:
- 编写一个简单的bash脚本,例如:
#!/bin/bash
sshpass -p "YOUR_PASSWORD" ssh -o StrictHostKeyChecking=no YOUR_USERNAME@SOME_SITE.COM
- 保存文件,例如'startMyServer',然后通过在终端中运行此文件来使其可执行:
sudo chmod +x startMyServer
- 将文件移动到“ PATH”变量中的文件夹中(在终端中运行“ echo $ PATH”以查看那些文件夹)。因此,例如,将其移至“ / usr / bin /”。
瞧,现在您可以在终端中输入“ startMyServer”进入服务器了。
P.S。 (1)这不是很安全,请查看ssh密钥以获得更好的安全性。
P.S。 (2)SMshrimant答案非常相似,对某些人来说可能更优雅。但是我个人更喜欢使用bash脚本。
答案 15 :(得分:0)
我设法使其起作用:
SSH_ASKPASS="echo \"my-pass-here\""
ssh -tt remotehost -l myusername
答案 16 :(得分:0)
这是我登录服务器的方式。
ssp <server_ip>
cat /home/myuser/Documents/ssh_script.sh
#!/ bin / bash
sshpass -p mypassword ssh root @ $ 1
因此...
ssp server_ip
答案 17 :(得分:0)
在下面的示例中,我将编写使用的解决方案:
方案:我想使用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"
答案 18 :(得分:-1)
使用此脚本在脚本内转换,第一个参数是主机名,第二个参数是密码。
#!/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"
答案 19 :(得分:-3)
要通过shell脚本连接远程计算机,请使用以下命令:
sshpass -p PASSWORD ssh -o StrictHostKeyChecking=no USERNAME@IPADDRESS
其中IPADDRESS
,USERNAME
和PASSWORD
是需要在脚本中提供的输入值,或者如果我们想在运行时提供“read”命令。
答案 20 :(得分:-3)
sudo ssh username@server_ip_address -p port_number
按Enter键,然后输入系统密码,然后最后输入服务器密码
答案 21 :(得分:-3)
这在大多数情况下应该会有所帮助(您需要先安装 sshpass!):
#!/usr/bin/bash
read -p 'Enter Your Username: ' UserName;
read -p 'Enter Your Password: ' Password;
read -p 'Enter Your Domain Name: ' Domain;
sshpass -p "$Password" ssh -o StrictHostKeyChecking=no $UserName@$Domain