`
macken
  • 浏览: 346031 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

用于shell脚本无交互的ssh自动登陆(转载)

 
阅读更多

 

ssh连接远程主机时候询问密码,跟su、sudo命令的默认行为一样,是不从stdin读入数据的,据称是为安全考虑,但是有时候在脚本当中确实需要无人守值的登陆。

搜索一下不难找到类似的例子,使用expect来完成密码应答:

 

#!/bin/bash
auto_login_ssh () {
    expect -c "set timeout -1;
                spawn -noecho ssh -o StrictHostKeyChecking=no $2 ${@:3};
                expect *assword:*;
                send -- $1\r;
                interact;";
}

 auto_login_ssh passwd user@host

 

StrictHostKeyChecking=no参数让ssh默认添加新主机的公钥指纹,也就不会出现出现是否继续yes/no的提示了。

 

expect很不错,上述代码基本可以达到要求了,能够当**用的ssh -D自动登陆,执行远程命令等等,但是如果作为一个完全非交互的远程工具,应该说还一差,不能返回整个连接执行过程是否成功。

 

使用expect后,程序的exit status是expect的,而不是ssh的,所以如果遇上连接不到的主机、密码错误等情况,expect也一样是正常退出,$?为0,所以需要对expect的代码稍加修改;

 

#!/bin/bash
auto_smart_ssh () {
    expect -c "set timeout -1;
                spawn ssh -o StrictHostKeyChecking=no $2 ${@:3};
                expect {
                    *assword:* {send -- $1\r;
                                 expect {
                                    *denied* {exit 2;}
                                    eof
                                 }
                    }
                    eof         {exit 1;}
                }
                "
    return $?
}
 
auto_smart_ssh passwd user@host ls /var
echo -e "\n---Exit Status: $?"

 

 

这段expect的Tcl代码我已经尽量弄的好看点了(但还是挺难看),主要作用是,如果在输入密码后遇到Permission denied,肯定是脚本提供的帐号有问题,就直接让expect按状态2退出;而如果主机不可达No route to host, timed out, Connection refused等情况,ssh会直接退出,expect收到eof,让其按状态1退出。而因为这个设计本来就用于执行远程命令后退出,不需要用户交互,所以第9行的eof则是让expect等待ssh退出,而不是不是进行interact了。

 

有这样的处理,使用auto_smart_ssh的脚本就可以根据返回值判断执行过程的是否成功,而进行相应处理了。

 

openssh里面另外一个很好用的远程文件传输工具scp,也以如法炮制:

 

auto_scp () {
    expect -c "set timeout -1;
                spawn scp -o StrictHostKeyChecking=no ${@:2};
                expect {
                    *assword:* {send -- $1\r;
                                 expect {
                                    *denied* {exit 1;}
                                    eof
                                 }
                    }
                    eof         {exit 1;}
                }
                "
    return $?
}
 
auto_scp pass ~/myfile user@host:~/path/to/myfile
echo $?

 后话:如果仅仅是日常使用,为了避免经常输入主机密码的麻烦,最理想的方法是生产本机的公/私密钥对,把指纹直接复制到远程主机上,较新的openssh提供了ssh-copy-id工具:

 

ssh-keygen
ssh-copy-id user@host1
ssh-copy-id user@host2
ssh-copy-id user@host3

 运行ssh-keygen时会问几个问题,全部回车默认就是我们要的效果了,分别把密钥分发到远程主机后,以后执行ssh user@host,还是scp,都是直接完成了。

 

如果需要删除远程机器上对应本机本账户的密钥,登陆到该账户,打开~/.ssh/authorized_keys文件,搜索你的用户名,删除那行,保存,即可。

 

当然也可以自动化:

 

auto_ssh_copy_id () {
    expect -c "set timeout -1;
                spawn ssh-copy-id $2;
                expect {
                    *(yes/no)* {send -- yes\r;exp_continue;}
                    *assword:* {send -- $1\r;exp_continue;}
                    eof        {exit 0;}
                }";
}

 转载:http://apt-blog.net/ssh_auto_login_in_shell_script

http://bbs.linuxtone.org/forum.php?mod=viewthread&tid=259

 

 

分享到:
评论

相关推荐

    centos7 ssh免密登录自动化配置脚本(ps:已测试过)

    shell脚本通常用于执行一系列命令,而expect则是一个交互式脚本语言,它可以模拟用户与程序的交互,非常适合自动处理需要用户输入的情况,比如SSH登录过程中的密码验证。 在"shell+expect编写的 大数据集群ssh免密...

    shell脚本实现ssh自动登录功能分享

    ### Shell脚本实现SSH自动登录功能详解 #### 一、背景与需求 在日常工作中,运维人员或开发人员经常需要远程连接到不同的服务器进行管理和操作。对于Mac用户来说,可能会发现缺少像SecureCRT这样的图形界面工具来...

    shell脚本远程启动其他服务器的tomcat传输文件自动登录判断启动停止

    Expect是一个用于自动化交互式进程的Tcl扩展,它可以模拟用户输入,使得脚本能够自动化处理需要人机交互的任务,例如SSH登录时输入密码。在这里,expect被用来自动化登录到远程服务器,避免手动输入密码,提高效率且...

    纯shell的自动登录执行脚本

    shell脚本是基于Bourne shell或其他类似shell(如bash)的解释型编程语言,用于自动化日常任务。在这个场景下,脚本会包含一系列的命令和控制结构,如循环、条件判断等,来实现自动化的登录过程和命令执行。 首先,...

    shell实现SSH自动登陆的方法示例

    前言 公司开发使用docker,每次登陆自己开发机总要输入 ssh user_name@ip_...在编写ssh自动登陆脚本之前,先说一下shell脚本的基础,此基础不是一些语法什么的,网上到处都是,这里总结了一下shell脚本的运行机制~

    linux编写bash shell脚本文件.sh 自动输入密码.在脚本中使用sudo命令,将密码保存在脚本中,不需要手动输入密码

    `expect`是一个Tcl扩展,专门用来自动化交互式程序,如SSH登录、FTP传输等。我们可以创建一个小型的`expect`脚本来自动发送密码给`sudo`。以下是一个简单的示例: ```bash #!/usr/bin/expect spawn sudo -S ...

    Linux通过Shell脚本命令修改密码的两种方式

    1. ssh 远程到主机; 2. 切换到root账号; [一般都是切换到root进行密码修改,如果普通用户修改自己的密码,要输入原密码,然后新密码要满足复杂度才OK]; 3. passwd username 使用passwd username 修改 username 的...

    自动登陆ssh,批量ip脚本操作

    标题提到的“自动登陆ssh,批量ip脚本操作”是指使用脚本自动化地通过SSH(Secure Shell)协议连接到多个具有不同IP地址的远程服务器。这种方法对于系统管理员来说非常实用,可以减少手动登录每个服务器的时间和工作...

    Shell脚本实现自动输入密码登录服务器

    Shell脚本实现自动输入密码登录服务器是自动化运维和部署中的常见需求,特别是在执行涉及权限验证的任务时,如scp文件传输或SSH远程连接。在这种情况下,使用expect工具可以帮助我们编写脚本,自动处理需要用户交互...

    SSH Secure Shell

    SSH(Secure Shell)是一种网络协议,用于在不安全的网络上提供安全的远程登录和其他服务。它是IT领域中广泛使用的工具,特别是在管理Linux或Unix服务器时。SSH Secure Shell提供了加密的数据传输,确保了用户的身份...

    交互式shell和非交互式shell、登录shell和非登录shell的区别 1

    **非交互式shell**则是在没有用户交互的情况下运行,通常用于执行脚本或由其他程序调用。在这种模式下,shell不等待用户的输入,而是从一个文件中读取预定义的命令序列并依次执行。当脚本执行完毕,shell会自动退出...

    shell脚本实现ssh-copy-id批量自动发送公钥到远程主机

    `expect`是一个Tcl扩展,专门用于自动化与交互式程序的通信,如SSH。它允许脚本发送输入、等待预期的输出,然后继续执行。以下是使用`expect`的示例脚本(`ssh-expect.sh`): ```bash #!/bin/bash NET=172.20.200 ...

    Linux环境通过shell脚本进行ssh登录服务器

    Linux环境通过shell脚本进行ssh登录服务器 里面包好ssh登录的用法以及interact交互 以及通过echo覆盖文件或者重定向文本,输入ssh远程服务器的密码,账户完全自动输入账号,密码登录服务器

    shell脚本,通过snmp方式获取远程服务器的CPU内存和硬盘的使用率

    总的来说,通过学习和实践这样的Shell脚本,你可以有效地自动化监控远程服务器的关键性能指标,从而提高IT运维的效率和响应速度。这个过程不仅涉及到了Shell脚本编程,还涉及到对SNMP协议的理解和应用,对于提升IT...

    11.26 交换机配置,支持远程网口登陆。写shell脚本的测试用例设计.rar

    Shell脚本是Linux/Unix系统中的一种自动化工具,用于执行一系列命令。在交换机配置的场景中,测试用例设计的主要目标是确保脚本的正确性和可靠性。设计测试用例时,应考虑以下几个方面: 1. **功能测试**:验证脚本...

    Shell脚本专家指南

    根据提供的信息,《Shell脚本专家指南》是一本深入讲解Shell脚本编程的书籍,适合中级到高级的Shell程序员以及需要解决日常问题的系统管理员阅读。本书不仅提供了实用的脚本和技巧,还深入探讨了Shell脚本编程的核心...

    Linux下基于Shell脚本的聊天工具.pdf

    在Linux环境下,多终端交互通常依赖于如telnet、VNC、ssh等远程登录方式。然而,实时交互的聊天应用并不多见,通常用户只能通过邮件或write命令实现非实时的信息传递。这个基于Shell和Awk的聊天工具填补了这一空白,...

    windows shell 脚本

    Windows Shell脚本是一种在Windows操作系统环境下执行的命令行脚本,它主要利用Windows自带的命令解释器(如CMD.exe或PowerShell.exe)来自动化一系列的系统操作。在本主题中,我们将深入探讨Windows Shell脚本的...

Global site tag (gtag.js) - Google Analytics