linux 免交互批量分发公钥脚本
时间: 2023-07-31 22:06:35 浏览: 318
好的,可以使用ssh-copy-id命令来批量分发公钥,具体步骤如下:
1. 在本地机器上生成密钥对(如果已有可以跳过此步骤),输入以下命令:
```
ssh-keygen -t rsa
```
2. 将公钥分发到远程机器上,输入以下命令:
```
ssh-copy-id -i ~/.ssh/id_rsa.pub user@remote_ip
```
其中,user为远程机器的用户名,remote_ip为远程机器的IP地址。
3. 如果要批量分发公钥,可以将远程机器的IP地址放入一个文本文件中,每行一个IP地址,例如:
```
192.168.1.100
192.168.1.101
192.168.1.102
```
4. 编写一个脚本来批量分发公钥,例如:
```
#!/bin/bash
# 读取IP地址文件
while read ip; do
# 分发公钥
ssh-copy-id -i ~/.ssh/id_rsa.pub user@$ip
done < ip_list.txt
```
其中,ip_list.txt为包含IP地址的文本文件。
5. 运行脚本,输入以下命令:
```
bash distribute_key.sh
```
这样就可以自动分发公钥到所有远程机器上,免去了交互操作的烦恼。
相关问题
Linux免密码自动登录的脚本
### Linux系统中免密码自动登录的脚本实现
#### 使用 `ssh-keygen` 和 `expect` 的组合方式
为了实现在Linux系统中的免密码自动登录,可以利用SSH公私钥认证机制以及自动化工具 `expect` 来完成整个过程。以下是具体的方法:
1. **生成 SSH 密钥对**
可以使用 `ssh-keygen` 命令来生成密钥对,并通过 `expect` 脚本来实现无交互式的操作[^4]。
下面是一个基于 `expect` 的脚本示例,用于自动生成 RSA 密钥对并设置默认选项(无需输入文件名、密码短语等):
```bash
#!/usr/bin/expect
set timeout 20
spawn ssh-keygen -t rsa -b 2048
expect {
"Enter file in" { send "\r"; exp_continue }
"Overwrite" { send "y\r"; exp_continue }
"Enter passphrase" { send "\r"; exp_continue }
"Enter same passphrase again" { send "\r"; exp_continue }
}
puts "SSH key generation completed."
```
2. **分发公钥到目标主机**
在生成密钥之后,需要将本地用户的 `.ssh/id_rsa.pub` 文件复制到远程服务器上对应的 `.ssh/authorized_keys` 中。可以通过以下两种方式进行操作:
- 手动拷贝命令:
```bash
scp ~/.ssh/id_rsa.pub user@remote_host:.ssh/authorized_keys
```
此时可能仍需手动输入一次密码[^2]。
- 使用 `ssh-copy-id` 工具简化流程:
```bash
/usr/bin/ssh-copy-id -i ~/.ssh/id_rsa.pub user@remote_host
```
这一过程中会提示输入密码以便验证身份[^3]。
3. **批量配置多台机器上的免密码登录**
如果有多个节点需要配置,则可编写循环脚本来逐一处理每台设备的信息列表。下面给出一段综合性的 Bash Shell Script 示例代码片段作为参考[^5]:
```bash
#! /bin/bash
input="hosts.txt"
while IFS= read -r line || [[ -n "$line" ]];do
ip=$(echo $line|cut -d' ' -f1)
username=$(echo $line|cut -d' ' -f2)
password=$(echo $line|cut -d' ' -f3)
./auto_ssh.sh "${username}" "${password}" "${ip}"
done <"$input"
```
其中,“hosts.txt”的格式如下所示:
```
192.168.x.y admin passwd_for_admin
...
```
#### 注意事项
- 确保所有涉及的目标主机均已安装 OpenSSH Server 组件。
- 配置防火墙规则允许 TCP/IP 协议端口 22 上的数据传输。
- 对于安全性考虑,在实际部署前应仔细评估是否有必要开启此类便利功能;如果确实必要的话,请妥善保管好生成好的私钥文件以防泄露风险发生。
linux分发文件shell脚本
### Linux 文件分发 Shell 脚本示例
#### 创建批量分发脚本并赋权
为了能够顺利地在多个主机上分发文件,首先需要创建一个可执行的Shell脚本。此操作可以通过以下命令完成:
```bash
touch /usr/shell/scp.sh && chmod 777 /usr/shell/scp.sh
```
这一步骤确保了`scp.sh`文件存在并且具有足够的权限来被执行[^1]。
#### 定义批量处理的目标主机列表
接下来,在脚本内部定义目标服务器地址列表。这部分内容可以根据实际情况调整,比如读取配置文件中的IP地址或主机名列表。这里简单展示一种方式——直接在脚本内硬编码hostnames:
```bash
#!/bin/bash
HOSTS=("host1.example.com" "host2.example.com") # 替换成实际的目标机器名称或者IP地址
FILE="/path/to/local/file"
DEST_DIR="/destination/path/on/remote/machines"
for HOST in "${HOSTS[@]}"; do
scp -r ${FILE} user@${HOST}:${DEST_DIR}
done
```
这段代码实现了遍历预设好的主机数组,并利用SCP协议将本地指定路径下的文件复制到每一台远程计算机上的相应位置。
#### 使用Expect实现无交互式的SSH密钥部署
对于首次连接新节点时遇到的公钥认证问题,可以借助于`expect`工具来自动生成应答流程,从而避免手动输入确认信息。下面是一个简单的例子说明怎样使用它来进行SSH密钥拷贝:
```bash
#!/usr/bin/expect -f
set ipaddress [lindex $argv 0]
set passwd [lindex $argv 1]
spawn ssh-copy-id root@$ipaddress
expect {
"yes/no" { send "yes\r"; exp_continue }
"password:" { send "$passwd\r" }
}
```
上述片段展示了如何设置环境变量存储待访问设备的信息(如IP地址和密码),并通过调用`ssh-copy-id`命令配合`expect`指令集模拟用户的键盘响应过程[^3]。
#### 利用SFTP进行安全的数据传输
如果希望采用更加稳定可靠的传输机制,则可以选择基于SFTP的服务接口。下面给出了一种方法论指导,即先上传私钥至远端用户目录下.ssh子文件夹中作为临时身份验证手段;之后再实施具体的文件转移动作:
```bash
sftp remote_user@remote_host <<EOF
put ~/.ssh/id_dsa.pub .ssh/
mkdir -p ~/target_directory
put local_file_path target_directory/
bye
EOF
```
此处运用到了Here Document语法结构(`<<`)向`sftp`会话传递一系列命令序列,直至结束标记为止。这种方式不仅简化了编程逻辑而且提高了程序易读性和维护便利度[^4]。
阅读全文
相关推荐

















