如何在远程服务器中以root身份执行本地脚本?

时间:2013-09-04 07:33:04

标签: linux bash shell ssh remote-server

我需要在远程服务器中执行具有root权限的shell脚本。 root用户无法通过SSH直接连接这些服务器。因此,我必须先将ssh作为普通用户连接,然后在执行脚本之前将其更改为root。用户和root密码是先前存储的参数,因此键盘交互不是一种选择。通过这种方式,我需要一个非(人类)交互式脚本,如:

#!/bin/sh

username=admin
password=admin123
hosts={host1..host50}

for hostname in $hosts ;
do
   ssh $username@$hostname sudo 'bash -s' < ./test.sh > results.txt
done

我该怎么做?在我当前的代码中,我需要为管理员用户连接键入密码,然后出现类似错误:sudo: no tty present and no askpass program specified。也许需要像expect这样的命令,但我在那里没有太多的专业知识。

感谢您的帮助。

PS:我不能使用SSH密钥,这些服务器不允许进行管理更改。

3 个答案:

答案 0 :(得分:1)

据我所知,你可以su -进入root,但你不想编辑sudoers和ssh密钥。
在这种情况下,expect是您的朋友。

Here你可以找到一个非常相似的例子,但我在这里复制了相关的代码部分。

#!/usr/bin/expect
set timeout 20

set host [lindex $argv 0]
set password [lindex $argv 1]

spawn ssh -tq $host su - root
expect "ssword" { send "pa55w0rd\r" }   # only if you login with password auth
expect "ssword" { send "$password\r" }
expect "#" { send "id -a \r" }          # run script as root
expect "#" { send \"exit\r" }

当然,您可以将其嵌入到shell脚本中,如下所示。

#!/bin/bash
expect -c "
...
expect eof"

我希望我能帮忙!

答案 1 :(得分:0)

使用SSH密钥以避免输入密码

查看此链接:https://wiki.archlinux.org/index.php/SSH_Keys

答案 2 :(得分:0)

如果您可以修改远程主机上的sudoers文件,您可以告诉sudoer服务不要为特定用户请求密码来执行sudo命令。

sudo visudo

将指令NOPASSWD添加到用户

Ubuntu site reference