`
macken
  • 浏览: 342912 次
  • 性别: 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

 

 

分享到:
评论

相关推荐

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

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

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

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

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

    主要介绍了Shell脚本实现自动输入密码登录服务器,本文使用expect来实现这个需求,讲解了expect的安装及使用脚本,需要的朋友可以参考下

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

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

    Shell脚本专家指南

    《Shell脚本专家指南》旨在为Linux、Unix以及OSx系统管理员提供短小精悍且功能强大的shell实现解决方案,教会读者如何使用现有调试器调试shell脚本。全书分为3个部分:脚本技术基础、系统交互和高级技术、有用的脚本...

    Python与shell的3种交互方式介绍

    下面我来逐步讲解一下shell的交互方式。 hello.py代码如下: 复制代码 代码如下: #!/usr/bin/python print “hello, world!” TestInput.py代码如下: 复制代码 代码如下: #!/usr/bin/python str = raw_input()

    远程批量修改linux服务器密码的脚本归类.pdf

    1. Expect 脚本的使用:Expect 是一个非常强大的工具,可以用来自动化交互式的 shell 会话。在本文档中,我们使用 Expect 来实现批量修改 Linux 服务器的密码。 2. SSH 的使用:SSH(Secure Shell)是一种安全的...

    交互试软件的脚本

    交互试软件的脚本 可以写SSH登陆的脚本,实现一些shell实现不了的功能

    generateSSH-42SP:使用 OpenSSH 生成和输出 SSH 密钥对的简单 shell 脚本

    使用 OpenSSH 生成和输出 SSH 密钥对的简单 shell 脚本。 该项目旨在帮助 42 名学生连接到系统,以便他们可以远程与存储库进行交互。 安装 $ git clone ...

    Passwordless-SSH:跨计算机自动创建和配置无密码SSH的脚本

    该脚本有助于在两台计算机之间配置无密码的SSH。范围该脚本本身无非就是设置一些简单的命令,以设置这个相当简单(如果很烦人)的过程,并且应使您专注于重要内容而不是记住语法细节。用法您必须将此脚本放在客户端...

    SecureCRT,一款支持SSH(SSH1和SSH2)的终端仿真程序,同时支持支持 SSH1,SSH2,Telnet,RLogin,Serial,和 TAPI 协议

    Secure Shell 加密登录和会话数据,包括以下支持: - 端口转发使 TCP/IP 数据更安全 - 口令,公钥,键盘交互和 Kerberos 验证 - AES,Twofish,Blowfish,3DES,RC4,和 DES 加密 - X11 转发 . 文件传输工具: ...

    基于Rust的SSH2客户端库设计源码

    这是一个基于Rust语言开发的SSH2客户端库,包含35个文件,其中主要文件类型包括19个Rust...该项目提供了用于SSH连接和交互的工具,支持多种SSH协议,适合需要进行远程服务器管理和自动化操作的开发者和系统管理员。

    shell实现批量登录服务器修改用户密码

    大多时候,作为Linux系统运维人员,需要编写shell脚本去批量处理一些反复的工作。虽然现在有ansible、saltstack等批量处理工具,但是在内网环境下,这些工具还需要离线安装,安装好之后还需要学会工具的使用方法,...

    WinSCP (Windows Secure Copy) 免费开源的广泛用于与Unix和Linux服务器系统的文件交互

    WinSCP (Windows Secure Copy) 是一个免费、开源的Windows应用程序,主要用于通过...脚本和自动化:WinSCP支持脚本和自动化功能,允许用户自动执行文件传输和同步任务。这对于需要定期执行文件备份或更新的任务非常有

    shell结合expect写的批量scp脚本工具

    expect用于自动化地执行linux环境下的命令行交互任务,例如scp、ssh之类需要用户手动输入密码然后确认的任务。有了这个工具,定义在scp过程中可能遇到的情况,然后编写相应的处理语句,就可以自动地完成scp操作了。 ...

    Ssh-Ninja:适用于Bruteforce安全Shell协议的Python脚本

    我使用pxssh是基于Pexpect的Python模块,用于建立SSH连接。 它的类扩展了pexpect.spawn以专门设置SSH连接。 是一个专门的模块,提供了直接与SSH会话进行交互的特定方法,例如login() , logout()和prompt(&#41...

    Azure-Ubuntu-20.04-ARM-template-and-script:使用ARM模板和交互式Bash Shell脚本创建Azure Ubuntu 20.04 LTS VM

    该模板在交互式Bash Shell脚本中使用Azure-CLI创建Ubuntu 20.04 LTS-Gen 1虚拟。使用此脚本创建的虚拟机使用密码进行身份验证,而不使用SSH密钥。 Bash脚本会验证密码,以满足Azure虚拟机的密码复杂性要求。 可以将...

    远程批量修改linux服务器密码的脚本

    然后又想到了用shell,不过发现很快就写不下去了,shell 的交互能力还是不能让人恭维的,最后发现了expect,expect 以其强大的交互能力,无疑是处理这类任务的首选,再加上expect 可以内嵌shell,这使得他变得更强大...

    基于SSH技术的Linux远程控制系统的设计与实现.pdf

    客户端包括SSH登录、SSHCommand执行、系统间信息交互、BASH脚本操控及日志记录等;在Linux服务器端布置SSH连接公钥、状态信息提取及资料FTP传输脚本等。 本系统的设计和实现基于以下几点考虑: 1. Linux操作系统的...

Global site tag (gtag.js) - Google Analytics