我想SSH
在脚本中使用,但这个脚本不会在我的机器上执行。
在我的实现中有两个限制。
- 我不能在 shell 的标准之外工作,因此我不能使用
expect
,因为我不知道它是否可以在这台机器上使用。 - 我不能指望这台机器会
public keys
为SSH
.
有哪些可能的解决方案?
如何在不添加额外依赖项的情况下以自动化和安全的方式为 ssh 提供请求的密码?
是否可以在脚本中提供密码?
谢谢大家 :)
安装 sshpass,然后启动命令:
sshpass -p "yourpassword" ssh -o StrictHostKeyChecking=no yourusername@hostname
出于安全原因,您必须避免在命令行上提供密码,否则任何运行 ps 命令的人都可以看到您的密码。最好像这样使用sshpass实用程序:
#!/bin/bash
export SSHPASS="your-password"
sshpass -e ssh -oBatchMode=no sshUser@remoteHost
首先:除非您知道为什么这样做是安全的(即您已经评估了知道该秘密的攻击者可以造成什么损害),否则不要以明文形式公开秘密。
如果您可以在脚本中添加秘密,您可以使用它发送一个 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 密钥的一个好处是您可以轻松地使用强制命令来限制密钥持有者可以在服务器上执行的操作。
更安全的方法是让脚本运行ssh-keygen -f ~/.ssh/my-script-key
以创建专用于此目的的私钥,但是您还需要一个例程来将公钥添加到服务器。
AFAIK 除了使用密钥之外没有任何可能性,或者如果您使用的是命令行版本ssh
。但是大多数编程语言都有库绑定,比如 C、python、php、...。你可以用这种语言编写程序。这样就可以自动传递密码。但请注意,这当然是一个安全问题,因为密码将以纯文本形式存储在该程序中
我完全同意每个人说这几乎可以肯定是一个糟糕的想法。极有可能允许其他人攻击您的计算机。
评估安全隐患后自行承担使用风险
制作一个/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_ASKPASS
和DISPLAY
setsid
ssh
没有控制终端的情况下
运行hostname
saypass
本地运行以获取密码farcommand
(如果给定)或交互式外壳。我通常使用date
或测试hostname
可选的farcommand
.
有很多地方会出错。
诀窍在于标准 Linux 命令行ssh
有几个环境变量,您可以使用它们来选择一个程序,该程序将被执行以提供密码。
ssh(1)
手册页说:
SSH_ASKPASS
如果ssh
需要密码,如果它是从终端运行的,它将从当前终端读取密码。 如果ssh
没有与之关联的终端但已设置DISPLAY
,SSH_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':"
以下是用于在主脚本中创建、使用和删除 a 的单个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
,上面的复制程序ssh
:
SSH_ASKPASS=/path/to/saypas DISPLAY=anything setsid scp username@hostname:/path/to/farfile .
真的不要使用这个,除非在可怕、可怕的情况下,比如你有数百台电脑,你不能安装像 ssh 密钥这样的东西,sshpass
甚至expect
.
如果您确实使用它,请不要告诉任何人我告诉过您如何使用它。这真的很可怕。
我不知道手册页关于“打开 X11 窗口”的含义,在我的测试中没有发生这样的事情。
经测试