在bash脚本中为ssh命令提供密码,不使用公钥和Expect

时间:2013-06-05 10:06:34

标签: linux bash shell ssh

我想在脚本中使用SSH,但这个脚本不会在我的机器上执行。

在我的实施中,有两个限制。

  • 我不能在shell的标准之外工作,因此我不能使用expect,因为我不知道它是否可以在这台机器上使用。
  • 我不能指望此机器public keys会有SSH

有哪些可能的选择 - 解决方案?

如何在不添加额外依赖项的情况下以自动且安全的方式为ssh提供所请求的密码?

是否可以在脚本中提供密码?

提前谢谢大家:)

5 个答案:

答案 0 :(得分:29)

安装sshpass,然后启动命令:

sshpass -p "yourpassword" ssh -o StrictHostKeyChecking=no yourusername@hostname

答案 1 :(得分:17)

出于安全原因,您必须避免在命令行上提供密码,否则运行ps命令的任何人都可以看到您的密码。最好像这样使用sshpass实用程序:

#!/bin/bash

export SSHPASS="your-password"
sshpass -e ssh -oBatchMode=no sshUser@remoteHost

您可能对 How to run the sftp command with a password from Bash script?

感兴趣

答案 2 :(得分:11)

首先:不要将明文置于明文 ,除非你知道为什么这是安全的事情(即你已经评估了可以做什么损害)被攻击者知道这个秘密。)

如果你可以在你的脚本中放置秘密,你可以随身携带一个ssh密钥并在ssh-agent shell中执行:

#!/usr/bin/env ssh-agent /usr/bin/env bash
KEYFILE=`mktemp`
cat << EOF > ${KEYFILE}
-----BEGIN RSA PRIVATE KEY-----
[.......]
EOF
ssh-add ${KEYFILE}

# do your ssh things here...

# Remove the key file.
rm -f ${KEYFILE}

使用ssh密钥的一个好处是,您可以轻松使用forced commands来限制密钥持有者在服务器上可以执行的操作。

更安全的方法是让脚本运行ssh-keygen -f ~/.ssh/my-script-key来创建专门用于此目的的私钥,但是您还需要一个例程来将公钥添加到服务器。

答案 3 :(得分:1)

AFAIK除了使用密钥或期望使用命令行版本ssh之外,没有其他可能性。但是有大多数编程语言的库绑定,如C,python,php,....你可以用这种语言写一个程序。这样就可以自动传递密码。但注意这当然是一个安全问题,因为密码将以纯文本形式存储在该程序中

答案 4 :(得分:0)

我完全同意每个人都说这几乎肯定是一个可怕的想法。极有可能允许他人攻击您的计算机。

在评估安全隐患后自行承担使用风险

答案

制作一个输出密码的程序/path/to/saypass,如

#!/bin/sh
echo 'secret'

使其可执行

chmod +x /path/to/saypass

那么这是主要的命令:

SSH_ASKPASS="/path/to/saypass" DISPLAY=anything setsid ssh username@hostname [farcommand]

这个

  • 设置两个环境变量 SSH_ASKPASSDISPLAY
    • 然后运行 ​​setsid
      • 然后在没有控制终端的情况下运行 ssh
        • 连接到远的 hostname
        • ... 在本地运行 saypass 以获取密码
        • ... 告诉远端服务器
        • ...并假设它是正确的
          • 然后运行 ​​farcommand(如果给定)或交互式 shell。

我通常使用 datehostname 测试可选的 farcommand

有很多地方会出错。

说明

这个技巧是标准的 Linux 命令行 ssh 有几个环境变量,您可以使用它们来选择执行以提供密码的程序。

ssh(1) 手册页说:

<块引用>

SSH_ASKPASS 如果 ssh 需要密码,如果它是从终端运行的,它将从当前终端读取密码。 如果ssh没有与之关联的终端但设置了DISPLAYSSH_ASKPASS,它将执行SSH_ASKPASS指定的程序并打开一个用于读取密码的 X11 窗口。

所以:您需要一个输出密码的程序(shell 脚本或任何其他类型)。然后你需要说服ssh使用它:

  • SSH_ASKPASS 设置为 /path/to/saypass
  • DISPLAY 设置为愚蠢的东西
  • 没有控制终端(这就是setsid所做的)

您将其放在以下 sh 命令中:

SSH_ASKPASS="/path/to/saypass" DISPLAY=anything setsid ssh username@hostname [command]

ssh 将执行

/path/to/saypass "username@hostname's password:"

指纹检查

如果需要指纹,通常会在您看到消息的地方

The authenticity of host '*hostname* (*ipaddress*)' can't be established.
ECDSA key fingerprint is SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.
Are you sure you want to continue connecting (yes/no)? 

然后 ssh 会像这样运行你的命令:

/path/to/saypass "Please type 'yes' or 'no':"

多合一脚本

以下是用于在主脚本中创建、使用和删除 saypass 的单个脚本。每个人都会告诉您不要将明文密码放在文件中,并且永远不要硬编码密码。他们有充分的理由告诉你:这会给你带来很多麻烦。使用风险自负。

#!/bin/sh

echo "#!/bin/sh\necho 'secret';rm -f /tmp/saypass.$$" > /tmp/saypass.$$
chmod 775 /tmp/saypass.$$
SSH_ASKPASS="/tmp/saypass.$$" DISPLAY=anything setsid ssh "$@"

SCP

这也适用于 scpssh 之上的复制程序:

SSH_ASKPASS=/path/to/saypas DISPLAY=anything setsid scp username@hostname:/path/to/farfile .

警告

除非在非常可怕的情况下,否则真的不要使用它,例如您有数百台计算机并且无法安装任何东西,例如 ssh 密钥,sshpass 甚至 expect

如果您确实使用了它,请不要告诉任何人我告诉过您如何使用它。真的很可怕。

我不知道手册页关于“打开 X11 窗口”是什么意思,在我的测试中没有发生这样的事情。

经过测试

  • OpenSSH_6.6.1p1 Ubuntu-2ubuntu2、OpenSSL 1.0.1f 2014 年 1 月 6 日在 Ubuntu 14.04.1 LTS 上,
  • OpenSSH_7.2p2 Ubuntu-4ubuntu2.1、OpenSSL 1.0.2g 2016 年 3 月 1 日在 Ubuntu 16.04.2 LTS 上
  • OpenSSH_7.6p1 Ubuntu-4ubuntu0.3、OpenSSL 1.0.2n 2017 年 12 月 7 日在 Ubuntu 18.04.5 LTS 上