Shell脚本--Here Document与expect 免交互

Here Document

是一个特殊用途的代码块。它在 Linux Shell 中使用 I/O 重定向的方式将命令列表提供给交互式程序或命令,比如 ftp、cat 或 read 命令。Here Document 是标准输入的一种替代品,可以帮助脚本开发人员不必使用临时文件来构建输入信息,而是直接就地生产出一个文件并用作命令的标准输入

特殊字符“<<”在标记和命令之前,这样做的目的是将命令块的输出重定向到程序或命令的 stdin。标记的选择要确保不会出现在其他地方,避免出现混淆;两个标记之间的内容被当做是一个文件并用作“命令”的标准输入。另外 Here Document 也可以与非交互式程序和命令一起使用

基本语法

命令 << 标记

...

...

标记

注意事项
  • 标记可以使用任意合法字符
  • 结尾的标记一定要顶格写,前面不能有任何字符
  • 结尾的标记后面也不能有任何字符(包括空格)
  • 开头标记前后的空格会被省略掉
  • 在第一行标记前‘-’,这个表示要抑制各行首 TAB 的作用
  • 将<<后的标记用单引号引起来会使两个标记之间的特殊字符失去效果被当成普通字符

示例        配置Java环境变量

cat >> /etc/profile << 'EOF'    //给/etc/profile内写入以下三行内容
export JAVA_HOME=/usr/local/java/
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
EOF

变量设定

Here Document 也支持使用变量,如果标记之间有变量被使用,会先替换变量值。如果想要将一些内容写入文件,除了常规的方法外,也可以使用 Here Document。如果写入的内容中包含变量,在写入文件时要先将变量替换成实际值,在结合 cat 命令完成写入

示例

[root@localhost ~]# vim here_var_replace.sh
#!/bin/bash 
doc_file="2019.txt" 
i="company"
cat > $doc_file << HERE 
Take him from home to $i 
HERE
[root@localhost ~]# chmod +x here_var_replace.sh 
[root@localhost ~]# ./here_var_replace.sh 
[root@localhost ~]# cat 2019.txt
Take him from home to company

在上述执行的过程中,标记内变量 i 的值被替换成了“company”,最终结果输出到

$doc_file 内,其值为 2019.txt。

除了变量替换,还可以使用 Here Document

<think>好的,我需要帮用户编写一个在CentOS 7上使用expect进行SSH互信配置的shell脚本。首先,我得回忆一下SSH互信的基本流程,通常包括生成密钥、分发公钥到目标机器、验证登录这几个步骤。 用户提到要使用expect,这说明需要自动化处理交互式的输入,比如输入密码。Expect是一个用来处理交互式命令的工具,可以自动应答密码提示等。我需要先检查系统是否安装了expect,如果没有,可能需要用户先安装。 接下来,脚本需要生成SSH密钥对。如果用户已经有密钥,可能需要覆盖还是跳过?不过通常自动化脚本会选择生成新的,所以应该使用ssh-keygen命令,并指定类型为RSA,同时使用-f指定密钥路径,-N设置空密码,这样生成过程中不需要交互。 然后是分发公钥到目标机器。这里需要遍历一个主机列表,逐个使用ssh-copy-id命令。但ssh-copy-id本身也会提示输入密码,所以需要用expect来自动输入密码。或者可以组合使用expect脚本来处理ssh-copy-id的过程。 或者,更直接的方法是使用expect来编写一个自动登录并追加公钥的脚本。比如,对于每个目标主机,使用expect连接到主机,将本地的公钥内容追加到目标机器的~/.ssh/authorized_keys文件中。这样可以避免依赖ssh-copy-id,但需要处理可能存在的目录和文件权限问题。 另外,需要注意目标主机上的.ssh目录是否存在,权限是否正确。如果不存在,需要创建并设置权限为700,authorized_keys文件权限为600。这些可以通过expect在连接后执行相应的命令来设置。 用户可能需要指定目标机器的IP列表、用户名和密码,这些可以作为脚本的参数或者放在配置文件中。为了灵活性,可能需要让用户修改脚本中的变量,比如USER、PASSWORD、HOSTS等。 安全性方面,硬编码密码在脚本中可能不安全,但如果是内网环境或者测试环境,可能可以接受。或者建议用户使用SSH密钥认证或其他更安全的方法,但根据用户需求,这里还是需要处理密码输入。 可能的错误处理包括网络连接失败、密码错误、权限问题等,但expect脚本处理这些可能比较复杂,可能需要简单的错误提示,或者记录日志。 综上,脚本的大致步骤是: 1. 生成SSH密钥对(如果不存在)。 2. 读取主机列表,逐个处理。 3. 对于每个主机,使用expect自动登录,并配置公钥。 4. 处理目标主机的.ssh目录和权限。 5. 测试SSH登录是否成功。 现在需要将这些步骤转化为具体的shell脚本,结合expect的自动应答。可能需要编写一个expect脚本块,嵌入到shell脚本中,或者单独调用expect脚本。这里可能选择在shell脚本中使用here document来嵌入expect代码。 需要注意的是,CentOS 7默认可能没有安装expect,所以用户需要先安装,可以在脚本开头提示,或者自动安装,但自动安装可能需要sudo权限,可能需要用户交互。 最后,测试脚本是否正常工作,可能需要用户提供正确的IP、用户名和密码,并确保网络连通。</think>以下是在CentOS 7上实现SSH互信配置的自动化脚本及详细说明: ```bash #!/bin/bash # 互信配置自动化脚本 # 需提前安装expect:yum install -y expect # 配置区(根据实际情况修改) USER="root" # 目标机器用户名 PASSWORD="your_password" # 目标机器密码 HOSTS=( # 目标机器IP列表 192.168.1.10 192.168.1.11 192.168.1.12 ) # 生成SSH密钥对(如果不存在) [ ! -f ~/.ssh/id_rsa ] && ssh-keygen -t rsa -P "" -f ~/.ssh/id_rsa # 配置单台主机的函数 setup_single_host() { local host=$1 /usr/bin/expect <<-EOF set timeout 30 spawn ssh-copy-id -i $HOME/.ssh/id_rsa.pub $USER@$host expect { "(yes/no)?" { send "yes\r"; exp_continue } "password:" { send "$PASSWORD\r" } } expect eof EOF # 验证配置结果 echo "正在验证 $host 互信配置..." ssh -o PasswordAuthentication=no $USER@$host "echo 互信配置成功!" || { echo -e "\033[31m$host 配置失败\033[0m" return 1 } } # 批量配置所有主机 for host in ${HOSTS[@]}; do echo "正在处理主机:$host" setup_single_host $host && \ echo -e "\033[32m$host 配置成功\033[0m" || \ echo -e "\033[31m$host 配置失败\033[0m" echo "--------------------------------------" done ``` 使用说明: 1. 准备工作: ```bash # 安装依赖 yum install -y expect openssh-clients # 创建脚本文件 vim mutual_trust.sh ``` 2. 修改配置参数: - `USER`:目标机器的用户名(建议使用root或有sudo权限的用户) - `PASSWORD`:目标机器的登录密码 - `HOSTS`:需要配置互信的目标机器IP数组 3. 执行脚本: ```bash chmod +x mutual_trust.sh ./mutual_trust.sh ``` 脚本执行流程说明: 1. 密钥生成阶段: - 检查`~/.ssh/id_rsa`是否存在 - 若不存在则自动生成无密码RSA密钥对 2. 互信配置阶段: - 使用`expect`自动化处理SSH交互 - 首次连接自动确认指纹验证(yes/no提示) - 自动输入密码完成公钥分发 - 自动创建目标主机`~/.ssh`目录(如有需要) - 自动设置目标主机文件权限(700/600) 3. 结果验证阶段: - 自动测试无密码登录 - 彩色输出显示配置结果(绿色成功/红色失败) 注意事项: 1. 网络要求: - 确保本机所有目标主机网络连通 - 确保SSH端口(默认22)开放 2. 权限要求: - 当前用户需要有目标主机的SSH登录权限 - 目标用户需要有写入`~/.ssh/authorized_keys`的权限 3. 安全建议: - 生产环境建议使用SSH密钥代替密码认证 - 建议配置完成后禁用密码登录 - 定期轮换SSH密钥对 4. 错误排查: ```bash # 查看详细执行过程 bash -x mutual_trust.sh # 检查目标主机日志 tail -f /var/log/secure ``` 扩展功能建议: 1. 增加配置文件分离(将主机列表单独存放) 2. 添加并行执行功能加速配置过程 3. 支持不同用户不同密码的配置 4. 增加日志记录功能 5. 添加回滚功能(异常时自动清理配置)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值