Mrli
别装作很努力,
因为结局不会陪你演戏。
Contacts:
QQ博客园

sshpass——shell脚本实现SSH连接其他主机并执行终端命令

2019/12/25 运维 Linux
Word count: 855 | Reading time: 4min

sshpass

ssh登陆不能在命令行中指定密码。sshpass的出现,解决了这一问题。即sshpass可以用于非交互SSH的密码验证,一般用在sh脚本中,无须再次输入密码

sshpass允许用-p参数指定明文密码,然后直接登录远程服务器。(支持密码从命令行、文件、环境变量中读取)

1.安装sudo apt install sshpass

2.使用说明

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# -p 直接指定密码
sshpass -p '123456' ssh user_name@host_ip

# -f: -f filename #后跟保存密码的文件名,密码是文件内容的第一行。
[root@zhu ~]# cat 1.txt
123456
[root@zhu ~]# sshpass -f 1.txt ssh root@192.168.56.102
Last login: Fri Apr 18 13:48:20 2014 from 192.168.56.101
[root@jiang ~]# exit
logout
Connection to 192.168.56.102 closed.

# -e #将环境变量SSHPASS作为密码
[root@zhu ~]# export SSHPASS=123456
[root@zhu ~]# sshpass -e ssh root@192.168.56.102
Last login: Fri Apr 18 13:51:45 2014 from 192.168.56.101
[root@jiang ~]# exit
logout
Connection to 192.168.56.102 closed.

shell脚本实现SSH连接其他主机并执行终端命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#!/bin/bash

# command -v <the_command> 检测命令是否存在返回命令所在路径,等价于which
# if [ -x file ] 如果文件存在且可执行
if ! [ -x "$(command -v sshpass)" ]; then
sudo apt-get install sshpass
fi

port=20005
# echo -e 会进行转义
echo -e "\n请输入用户名!\n"
# read-将交互输入保存在变量中
read name
# 获得当前脚本的工作路径
dir=$(cd $(dirname $0);pwd)
# 分割->获得文件名
file_name="${dir##*/}"
# 传输文件
echo -e "\n[开始传输文件]\n"
sshpass -p "$key" scp -r -P $port $dir username@IP_address:/data/cluster/$name
if [ $pool -eq 1 ]||[ $pool -eq 2 ]||[ $pool -eq 3 ]
then
# remotessh为标记符,下面的内容全部重定向到ssh连接的终端中, 一定要保证下面的全是以字符串的形式
# 由于shell会进行预转换,所以shell特殊的量需要额外注意,否则结果将只会是当前主机的。因此需要加\
# man sshpass中提示:多个-t选项强制分配tty,即使ssh没有本地tty,所以使用-tt参数来强制伪终端分配(表示为这个连接分配TTY),即使标准输入不是终端,否则退出后会提示`Pseudo-terminal will not be allocated because stdin is not a terminal的错`。 即指明是来自脚本的调用
# 控制终端(/dev/tty)就是当前进程的控制终端的设备特殊文件,可以进行写入写出
sshpass -p "$key" ssh -tt -p $(($port+$pool)) username@IP_address << remotessh
Condor_number=\`condor_q | grep jobs | awk '{print \$1}'\`
if [ \$Condor_number -le 1 ]
then echo -e "\n创建任务失败!\n"
else echo -e "\n创建任务成功!\n"
fi
exit
remotessh
else
echo -e "没有该资源池\n"
exit
fi

man sshpass中关于-t参数的说明

Force pseudo-terminal allocation. This can be used to execute arbitrary screen-based programs on a remote machine, which can be very useful, e.g. when implementing menu services. Multiple -t options force tty allocation, even if ssh has no local tty.

总结:

所以实现的方法主要是:

  • SSHpass非交互式登录
  • SSH终端执行多条命令

附录

ssh@host:ssh切换到其他机器上执行多条命令
Shell表达式,${file##*/} 取后缀
shell-if表达式(-f,-d,-s,-r,-w,-x,-eq,-ne,-ge,-gt,-le,-lt )
Linux检测命令是否存在

Author: Mrli

Link: https://nymrli.top/2019/12/25/sshpass——shell脚本实现SSH连接其他主机并执行终端命令/

Copyright: All articles in this blog are licensed under CC BY-NC-SA 3.0 unless stating additionally.

< PreviousPost
PAT冲冲冲——乙级
NextPost >
树莓派初始化操作
CATALOG
  1. 1. sshpass
  2. 2. shell脚本实现SSH连接其他主机并执行终端命令
  3. 3. 总结:
  4. 4. 附录