【问题标题】:AutoMagically Insert Password With Bash Script [duplicate]使用 Bash 脚本自动插入密码 [重复]
【发布时间】:2026-01-26 10:50:01
【问题描述】:

我正在尝试自动化我的 ancible 部署只是想了解更多信息,我试图在复制 ssh 密钥时自动插入机器的密码但是它仍然每次都提示我输入密码,我不知道为什么,也许它在提示之前发送密钥我不确定..

#!/bin/bash
apt-get update --force-yes
apt-get install software-properties-common -y --force-yes
apt-add-repository ppa:ansible/ansible -y --force-yes
apt-get update -y --force-yes
apt-get install ansible -y --force-yes
ssh-keygen -t rsa -N "" -f ~/.ssh/id_rsa 
ssh-copy-id root@0.0.0.0
send("mypass{enter}")

【问题讨论】:

  • sendexpect 命令而不是 shell 命令。你不能就这样使用send
  • @EtanReisner 那你建议我怎么做?
  • 如果你想使用expect,那么你使用expect。如果你不设置 ssh 密钥。如果您不能/不想这样做,您也可以查看sshpass 但是键是最好的方法。
  • 期望如何使用?
  • Oz123 的回答是为此目的的期望脚本的一个合理示例。

标签: linux bash ubuntu ssh


【解决方案1】:

你可以使用expect,或者如果你知道python,你可以使用简单的模块Pexpect:

#!/usr/bin/expect

set timeout 20

set ip [lindex $argv 0]

set user [lindex $argv 1]

set password [lindex $argv 2]

spawn ssh "$user\@$ip"

expect "Password:"

send "$password\r";

interact

您最好的选择是将您的服务器配置为允许使用密钥身份验证的 ssh。

【讨论】:

【解决方案2】:

如果您能提供帮助,您希望避免将密码放入任何类型的脚本中——而且您可以。 sshrsync等都可以通过public-key/private-key认证进行远程操作。用它。除非您需要 rsa 加密,否则请使用 dsa

怎么样?你在正确的轨道上。假设您在localhost 上并且想要更新/管理remotehost。 ansible 文档是怎么说的?

当与远程机器交谈时,Ansible 通过 默认假设您使用的是 SSH 密钥。

如何设置 SSH 密钥?

简单。您需要在 localhost 上生成 public/private 密钥对,然后将 public-key 传输到 remotehost 并将其附加到 ~/.ssh/authorized_keys 文件中。生成密钥对是一个命令(默认长度很好):

ssh-keygen -t dsa

默认情况下会在~/.ssh/ 中的localhost 上创建以下内容:

-rw------- 1 youruser yourgroup 668 Jun 13  2008 id_dsa
-rw-r--r-- 1 youruser yourgroup 603 Jun 13  2008 id_dsa.pub

注意:您的私钥id_dsa上的权限必须是0600

将公钥传输到remotehost

rsync -uav ~/.ssh/id_dsa.pub remotehost:~/.ssh/id_dsa-localhost.pub

注意: 按照惯例,最好在 remotehost 上给 public-key 一个唯一的名称,以避免无意中覆盖来自另一个主机。 (即 - 将id_dsa.pub 转移为id_dsa-localhost.pub)现在您需要做的就是将公钥附加到authorized_keys 文件中:

ssh remotehost "cat ~/.ssh/id_dsa-localhost.pub >> ~/.ssh/authorized_keys"

现在使用您的私钥安全地localhost 登录到remotehost

ssh remotehost

仅此而已。

我需要以root 的身份传输文件,现在是什么

除了关于不这样做的所有常规警告之外,等等...,您有两个选择:为 root 创建另一个公钥/私钥对;或者,如果您是唯一的管理员/用户并且这是您的盒子,那么只需将 su 复制到 root 并将您的 /home/you/.ssh/id_dsa/home/you/.ssh/id_dsa.pub 复制到 /root/.ssh 上的 localhost

然后在 remotehost(同样是你的盒子)上,copy /home/you/.ssh/id_dsa-localhost.pub/root/.ssh/id_dsa-localhost.pub,然后将 /root/.ssh/id_dsa-localhost.pub 附加到 /root/.ssh/authorized_keys(你必须检查/更新 @ 987654357@ 的所有文件复制到root:root 并确保权限正确。)

注意:虽然sshd 默认允许root 登录,但某些发行版不允许。您必须确保 PermitRootLogin 未在 /etc/ssh/sshd_config 中设置为 No

应该是这样的。如果有任何问题,请尝试使用ssh -vv 登录ssh,您将获得诊断问题所需的所有信息。

【讨论】: