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
相关推荐
前言 公司开发使用docker,每次登陆自己开发机总要输入 ssh user_name@ip_...在编写ssh自动登陆脚本之前,先说一下shell脚本的基础,此基础不是一些语法什么的,网上到处都是,这里总结了一下shell脚本的运行机制~
1. ssh 远程到主机; 2. 切换到root账号; [一般都是切换到root进行密码修改,如果普通用户修改自己的密码,要输入原密码,然后新密码要满足复杂度才OK]; 3. passwd username 使用passwd username 修改 username 的...
主要介绍了Shell脚本实现自动输入密码登录服务器,本文使用expect来实现这个需求,讲解了expect的安装及使用脚本,需要的朋友可以参考下
Linux环境通过shell脚本进行ssh登录服务器 里面包好ssh登录的用法以及interact交互 以及通过echo覆盖文件或者重定向文本,输入ssh远程服务器的密码,账户完全自动输入账号,密码登录服务器
《Shell脚本专家指南》旨在为Linux、Unix以及OSx系统管理员提供短小精悍且功能强大的shell实现解决方案,教会读者如何使用现有调试器调试shell脚本。全书分为3个部分:脚本技术基础、系统交互和高级技术、有用的脚本...
下面我来逐步讲解一下shell的交互方式。 hello.py代码如下: 复制代码 代码如下: #!/usr/bin/python print “hello, world!” TestInput.py代码如下: 复制代码 代码如下: #!/usr/bin/python str = raw_input()
1. Expect 脚本的使用:Expect 是一个非常强大的工具,可以用来自动化交互式的 shell 会话。在本文档中,我们使用 Expect 来实现批量修改 Linux 服务器的密码。 2. SSH 的使用:SSH(Secure Shell)是一种安全的...
交互试软件的脚本 可以写SSH登陆的脚本,实现一些shell实现不了的功能
使用 OpenSSH 生成和输出 SSH 密钥对的简单 shell 脚本。 该项目旨在帮助 42 名学生连接到系统,以便他们可以远程与存储库进行交互。 安装 $ git clone ...
该脚本有助于在两台计算机之间配置无密码的SSH。范围该脚本本身无非就是设置一些简单的命令,以设置这个相当简单(如果很烦人)的过程,并且应使您专注于重要内容而不是记住语法细节。用法您必须将此脚本放在客户端...
Secure Shell 加密登录和会话数据,包括以下支持: - 端口转发使 TCP/IP 数据更安全 - 口令,公钥,键盘交互和 Kerberos 验证 - AES,Twofish,Blowfish,3DES,RC4,和 DES 加密 - X11 转发 . 文件传输工具: ...
这是一个基于Rust语言开发的SSH2客户端库,包含35个文件,其中主要文件类型包括19个Rust...该项目提供了用于SSH连接和交互的工具,支持多种SSH协议,适合需要进行远程服务器管理和自动化操作的开发者和系统管理员。
大多时候,作为Linux系统运维人员,需要编写shell脚本去批量处理一些反复的工作。虽然现在有ansible、saltstack等批量处理工具,但是在内网环境下,这些工具还需要离线安装,安装好之后还需要学会工具的使用方法,...
WinSCP (Windows Secure Copy) 是一个免费、开源的Windows应用程序,主要用于通过...脚本和自动化:WinSCP支持脚本和自动化功能,允许用户自动执行文件传输和同步任务。这对于需要定期执行文件备份或更新的任务非常有
expect用于自动化地执行linux环境下的命令行交互任务,例如scp、ssh之类需要用户手动输入密码然后确认的任务。有了这个工具,定义在scp过程中可能遇到的情况,然后编写相应的处理语句,就可以自动地完成scp操作了。 ...
我使用pxssh是基于Pexpect的Python模块,用于建立SSH连接。 它的类扩展了pexpect.spawn以专门设置SSH连接。 是一个专门的模块,提供了直接与SSH会话进行交互的特定方法,例如login() , logout()和prompt()...
该模板在交互式Bash Shell脚本中使用Azure-CLI创建Ubuntu 20.04 LTS-Gen 1虚拟。使用此脚本创建的虚拟机使用密码进行身份验证,而不使用SSH密钥。 Bash脚本会验证密码,以满足Azure虚拟机的密码复杂性要求。 可以将...
然后又想到了用shell,不过发现很快就写不下去了,shell 的交互能力还是不能让人恭维的,最后发现了expect,expect 以其强大的交互能力,无疑是处理这类任务的首选,再加上expect 可以内嵌shell,这使得他变得更强大...
客户端包括SSH登录、SSHCommand执行、系统间信息交互、BASH脚本操控及日志记录等;在Linux服务器端布置SSH连接公钥、状态信息提取及资料FTP传输脚本等。 本系统的设计和实现基于以下几点考虑: 1. Linux操作系统的...