shell 非交互式登录远程服务端执行命令

518 阅读1分钟
概览
适宜人群Linux 基础、shell 编程基础
本文字数约等于 269 字
阅读时间约等于 1 分钟
涉及知识ssh,sshpass,shell,linux,python

解决问题

有些情况下,我们需要编写非交互的 shell 脚本操作 Linux 服务器,单纯运用 ssh 工具是不提供这种功能的,因此引出了下文的 sshpass 工具和 python 的 pty 模块,以及 expect 工具

名词解析(只针对本文内容)

交互:即操作 ssh Linux 命令操作的时候,需要手动输入密码 非交互:sshpass 通过读取和预置密码的方式,无需手动输入密码

使用 sshpass 的方式

sshpass -p "${SSH_PASSWORD}"  ssh -o StrictHostKeyChecking=no "${SERVER_USER_NAME}"@"${SERVER_IP}" "ls -al"

使用 python 的方式

使用 python 自带一个名为 pty 的 modual,它有一个 spawn 函数,manual中对它的描述是:

pty.spawn(argv[, master_read[, stdin_read]])

Spawn a process, and connect its controlling terminal with the current process’s standard io. This is often used to baffle programs which insist on reading from the controlling terminal.

脚本名称 pty-process.py

#!/bin/env python
import pty
import sys
pty.spawn(sys.argv[1:])

执行语句

echo $passwd |./pty-process.py ssh $usr@$remote $command

非交互式复制远程服务器上的文件

sshpass -p "${SSH_PASSWORD}"  scp -o StrictHostKeyChecking=no -r "${SERVER_USER_NAME}"@"${SERVER_IP}":"${FILE_PATH}" "${CURRENT_PATH}"