信息化浪潮席卷全球的当下,数字化转型已成为各行各业的核心驱动力,而作为这一进程守护者的运维工作,其重要性与日俱增。面对瞬息万变的IT环境,复杂多元的系统架构,以及日益严苛的服务质量要求,高效的自动化工具与脚本已成为运维人员提升工作效率、确保系统稳定性不可或缺的“秘密武器”。有鉴于此,我倾力编撰了这份精心筛选与整理的Shell脚本合集,旨在为广大的运维同行献上一份诚意满满的“运维人福利”,助您在应对日常运维挑战时如虎添翼,从容不迫。
这份脚本合集,犹如一座蕴藏着丰富矿藏的知识宝库,凝结了我在实战运维工作中积累的点滴智慧与宝贵经验。它深度聚焦服务器监控、故障排查、数据备份与恢复、性能调优、自动化部署等运维核心领域,旨在为每一位身处其中的专业人士提供全方位的支持。无论是初涉运维领域的新人,渴望快速掌握实战技巧,还是久经沙场的资深专家,寻求优化现有流程、提升运维效能的新思路,都能在这份合集中找寻到契合自身需求的解决方案。
每一款脚本均经过真实业务场景的反复打磨与严格测试,秉持着简洁高效、易于理解和使用的理念设计。它们不仅具备高度的灵活性与适应性,能够轻松应对各种复杂运维环境下的多样化需求,而且注释详尽,逻辑清晰,旨在成为您日常工作中随时查阅、快速上手的实用指南。无论是自动化执行例行任务,迅速响应突发事件,还是深入挖掘系统瓶颈,优化资源分配,这些脚本都将化身为您的得力助手,使繁复的运维工作变得有条不紊,事半功倍。
我热忱欢迎所有运维同仁自由取阅、广泛分享这份宝贵的Shell脚本资源,将其融入个人的工作实践中,或是作为团队协作、技能培训的参考资料。它们不仅是提升个人技能、优化工作流程的有效工具,更是增进同行间技术交流、知识共享的优质载体。让我们携手共进,充分运用这份脚本合集所蕴含的技术力量,积极推动运维工作的智能化、自动化进程,共同为构建稳定、高效、可靠的信息化系统保驾护航,为企业的数字化转型之路奠定坚实基础。在这个瞬息万变的数字化时代,让我们以匠心独运的运维智慧,驾驭科技之舟,破浪前行,共创辉煌!
今天我们要分析的是:
expect实现远程登陆自动交互
#!/usr/bin/expect -f
set ipaddress [lindex $argv 0]
set passwd [lindex $argv 1]
set timeout 30
spawn ssh-copy-id root@$ipaddress
expect {
"yes/no" { send "yes\r";exp_continue }
"password:" { send "$passwd\r" }
}
#expect "*from*"
#send "mkdir -p ./tmp/testfile\r"
#send "exit\r"
#expect "#" #i# 命令运行完, 你要期待一个结果, 结果就是返回shell提示符了(是# 或者$)
脚本实现过程
- 指定脚本类型:首行
#!/usr/bin/expect -f
表明这是一个使用expect
语言编写的脚本,应由expect
解释器执行。 - 接收命令行参数:
set ipaddress [lindex $argv 0]
:从命令行参数列表中获取第一个参数(索引为0),将其值赋给变量ipaddress
,这个变量应包含要连接的远程主机IP地址。set passwd [lindex $argv 1]
:类似地,从命令行参数列表中获取第二个参数(索引为1),将其值赋给变量passwd
,这个变量应包含登录远程主机所需的密码。
- 设置超时时间:
set timeout 30
指定了脚本等待交互响应的最长时间为30秒。若超过此时间未收到预期的输出,expect
将产生超时错误。 - 启动
ssh-copy-id
进程:spawn ssh-copy-id root@$ipaddress
命令启动一个新的子进程,执行ssh-copy-id
命令,尝试将本地用户的SSH公钥复制到远程主机(以root
用户身份登录)。 - 定义交互规则:接下来的
expect
块定义了脚本如何与ssh-copy-id
进程交互。
"yes/no"
:当脚本检测到输出中含有“yes/no”字样时,表示远程主机询问是否将新公钥添加到授权列表中。此时,脚本发送回车键(\r
)后跟随字符yes
,表示同意添加。"password:"
:当脚本检测到“password:”提示时,表示远程主机要求输入密码。此时,脚本发送回车键后跟随变量$passwd
的值,即用户提供的密码。
- 注意,
exp_continue
关键字确保在处理“yes/no”情况后,脚本继续监听后续交互,直到匹配到“password:”提示并完成相应操作。
注释部分说明
被注释掉的三行代码原本可能用于在成功登录后执行其他远程命令:
expect "*from*"
:等待含有“from”的输出,这通常出现在SSH连接建立成功后显示的信息中。一旦出现,意味着已经成功登录到远程主机。send "mkdir -p ./tmp/testfile\r"
:发送命令(创建目录./tmp/testfile
)及其回车键,执行该命令。send "exit\r"
:发送exit
命令及其回车键,退出远程登录会话。expect "#"
:等待远程主机的 shell 提示符(假设是#
,代表root用户)。这表示命令执行完毕且已返回到命令行提示状态。
如何使用
- 确保
expect
命令可用:确认系统已安装expect
工具。如果没有,可以通过包管理器(如apt
,yum
, 或brew
)进行安装。 - 准备公钥:在本地机器上生成SSH公钥对(如果尚未生成),通常执行
ssh-keygen
命令即可。公钥默认保存在~/.ssh/id_rsa.pub
。 - 运行脚本:提供远程主机IP地址和密码作为参数执行脚本,例如:
- Bash
1./your_script_name.sh 192.168.1.100 your_password
- 这将自动执行
ssh-copy-id
命令,将本地公钥复制到远程主机的root
用户目录下,过程中自动回答“yes/no”提示并输入密码。完成后,您无需密码即可通过SSH密钥认证登录该远程主机。
总结来说,这个脚本利用expect
工具自动化了ssh-copy-id
命令的交互过程,使得用户能够便捷地将本地SSH公钥部署到远程服务器,实现无密码登录。只需提供远程主机IP地址和登录密码作为脚本参数运行,即可完成公钥的自动部署。如果您需要在部署公钥后执行其他远程命令,可以取消相关注释并按照需求调整命令内容。
如果想上手操作练代码的同学们可以通过阿里云ecs服务器免费试用参与!
入口:新老同学免费试用