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

kadbb459  于 2023-08-07  发布在  Shell
关注(0)|答案(5)|浏览(80)

我想在脚本中使用SSH,但是这个脚本不会在我的机器上执行。
在我的实现中有两个限制。

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

可能的选项-解决方案是什么?
如何在不添加额外依赖项的情况下,以自动化和安全的方式向ssh提供所请求的密码?
是否可以在脚本中提供密码?
提前感谢大家:)

bjg7j2ky

bjg7j2ky1#

安装sshpass,然后启动命令:

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

字符串

wnrlj8wa

wnrlj8wa2#

出于安全原因,您必须避免在命令行上提供密码,否则任何运行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?**感兴趣

mf98qq94

mf98qq943#

首先要说明的是:**不要把秘密放在明文中 * 除非 * 你知道为什么这样做是安全的(即您已经评估了知道该秘密的攻击者可能造成的损害)。
如果你可以在脚本中加入secret,你可以附带一个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来创建专用于此目的的私钥,但是还需要一个例程来将公钥添加到服务器。

wqnecbli

wqnecbli4#

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

uz75evzq

uz75evzq5#

我完全同意每个人说这几乎肯定是一个非常糟糕的主意。但是,如果您已经评估了您的需求并想知道如何完成,当然可以不使用密钥,也不安装任何其他程序,只需使用Bourne Shell机制。

在评估安全危害后使用,风险自负

回复

编写一个输出密码的程序/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,使用saypass程序来获取密码。(/path/to必须替换为脚本的路径; anything可以是这个字符串;将username@hostname替换为您的详细信息。)
详细内容:

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

我通常使用datehostname测试可选的farcommand
有很多地方会出问题。

说明

这里的技巧是,标准的Linux命令行ssh有几个环境变量,您可以使用它们来选择一个程序,该程序将被执行以提供密码。这是为X11用户界面设计的,但也可以用于我们的目的。
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 "Password:"
/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
如果你必须使用这种技术,把你的密码放在一个文件中,让saypass从那里得到它。使saypass尽可能安全;你可以通过环境向它传递信息。
我不知道手册页上关于“打开一个X11窗口”是什么意思,在我的测试中没有发生过这样的事情。
测试日期

  • OpenSSH_6.6.1p1 Ubuntu-2ubuntu2,OpenSSL 1.0.1f 6 Jan 2014 on Ubuntu 14.04.1 LTS,
  • OpenSSH_7.2p2 Ubuntu-4ubuntu2.1,OpenSSL 1.0.2g 1 Mar 2016 on Ubuntu 16.04.2 LTS
  • OpenSSH_7.6p1 Ubuntu-4ubuntu0.3,OpenSSL 1.0.2n 7十二月2017在Ubuntu 18.04.5 LTS

相关问题