ShellShell 脚本自动输入密码的三种方式

Posted fyn.L

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ShellShell 脚本自动输入密码的三种方式相关的知识,希望对你有一定的参考价值。

Shell 脚本自动输入密码的三种方式




注意,如果创建.sh文件后不可以执行,请执行sudo chmod 755 文件名.sh来修改权限。




方式一

使用 echo “密码” | (管道符)

使用场景: sudo 命令

在使用普通用户执行 root 命令时有时候会需要输入密码,并且在输入密码后一段时间不需要再次输入(但是不影响),这时候可以使用

echo "密码" | sudo 命令

比如我需要一键清空服务器,则可以创建一个clear.sh文件(假使我的密码是 123456):

echo "123456" | sudo rm -rf /*

那么在执行的时候,我只需要./clear.sh就可以清空我的整个数据库。



方式二

重定向

用重定向方法实现交互的前提是指令需要有参数来指定密码输入方式,如ftp就有-i参数来指定使用标准输入来输入密码

shell用重定向作为标准输入的用法是:cmd<<delimiter ,shell 会将分界符delimiter之后直到下一个同样的分界符之前的内容作为输入

使用场景:不仅仅输入一个密码,还需要输入用户名。

ftp -i -n 192.168.21.46 <<EOF
user 用户名 密码
EOF


方式三

expect

echo + 管道符不是什么时候都可以生效(比如我写的自动提交博客脚本最后需要输入我的服务器的 git 仓库密码就不生效),因此我们可以使用 expect 方法来执行。

set timeout 30
spawn ssh -l 用户名 10.125.25.189
expect "password:"
send "要输入的密码"    
interact

这里的语句是这样的:

  1. 设置超时时间为30s
    1. spawn 是 expect 的起始语句,可以理解为从此处开始
    2. spawn 后面的语句是执行 ssh 连接
  2. expect:当发现password:这个字符串后,在后方输入send后面的内容
  3. send:要输入的密码
  4. interact:执行完留在远程控制台,不加这句执行完后返回本地控制台
再举一个例子

这个例子是我真实的脚本文件(但是磨掉了密码),平时用于往我的服务器中提交 hexo 博客

cd /Users/jim/hexo
echo '123456' | sudo -S hexo clean 
sudo hexo g 
spawn sudo -S hexo d
expect "password:"
send "123456"

首先进入到hexo文件夹下

因为要用到sudo 来 clean/generate/deploy我的博客,所以我这里使用一个 echo+管道符,输入一次 sudo 命令(短时间内不需要再重复输入,所以我只写了一个)

generate 一下 hexo 文件

提交到远程仓库,这里需要输入远程仓库的密码,所以我用spawn标记这句话

expect(发现)到"password:"后执行send

将我的密码 send(发送到)到控制台

Shell脚本自动输入密码的三种方式

平时在控制台输入指令如:sudo、ssh、ftp或者修改admin权限的文件时候都会要求输入password,但是在she'll脚本运行过程中该如何交互实现自动输入密码呢?

下面总结三种实现方法。

一、重定向:用重定向方法实现交互的前提是指令需要有参数来指定密码输入方式,如ftp就有-i参数来指定使用标准输入来输入密码

        shell用重定向作为标准输入的用法是:cmd<<delimiter ,shell 会将分界符delimiter之后直到下一个同样的分界符之前的内容作为输入

  实现ftp自动登录并运行ls指令的用法如下:其中zjk为用户名,zjk123为密码        

ftp -i -n 192.168.21.46 <<EOF
user zjk zjk123
ls
EOF

二:管道:跟重定向一样,指令同样要有参数来指定密码输入方式,如sudo的-S参数,passwd的-stdin参数
       所以实现sudo自动输入密码的脚本如下:其中zjk123为密码

      echo 'zjk123' | sudo -S cp file1 /etc/hosts
      实现自动修改密码的脚本写法如下:

      echo 'password' | passwd -stdin username


三:expect:上面介绍的两种方法前提条件是指令有参数来设定密码输入方式,像ssh指令就没有这样的参数,第三种交互方式就派上用场了

       expect就是用来做交互用的,基本任何交互登录的场合都能使用,但是需要安装expect包

      语法如下:

#!/bin/expect
set timeout 30
spawn ssh -l jikuan.zjk 10.125.25.189
expect "password:"
send "zjk123\\r"    
interact


注意:expect跟bash类似,使用时要先登录到expect,所以首行要指定使用expect
在运行脚本时候要expect  file,不能sh file了

上面语句第一句是设定超时时间为30s,spawn是expect的语句,执行命令前都要加这句。

expect "password:"这句意思是交互获取是否返回password:关键字,因为在执行ssh时会返回输入password的提示:jikuan.zjk@10.125.25.189's password:

send就是将密码zjk123发送过去,\\r表示回车

interact代表执行完留在远程控制台,不加这句执行完后返回本地控制台 
      
————————————————
版权声明:本文为CSDN博主「zhangjikuan」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zhangjikuan/article/details/51105166

-- NORMAL --

以上是关于ShellShell 脚本自动输入密码的三种方式的主要内容,如果未能解决你的问题,请参考以下文章

Shell脚本交互之:自动输入密码

在Vue中输入框自动获取焦点的三种方式

Oracle数据库的三种验证机制

oracle 导入导出dmp的三种方式

js表单提交的三种方式

Weblogic的三种部署方式