Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何在远程服务器中以root用户身份执行本地脚本?_Linux_Bash_Shell_Ssh_Remote Server - Fatal编程技术网

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

Linux 如何在远程服务器中以root用户身份执行本地脚本?,linux,bash,shell,ssh,remote-server,Linux,Bash,Shell,Ssh,Remote Server,我需要在远程服务器上以root权限执行shell脚本。根用户无法通过SSH直接连接这些服务器。因此,我必须首先以普通用户的身份连接ssh,然后在执行脚本之前将其更改为root。用户密码和根密码是以前存储的参数,因此键盘交互不是选项。这样,我需要一个非(人类)交互脚本,如: #!/bin/sh username=admin password=admin123 hosts={host1..host50} for hostname in $hosts ; do ssh $username@$

我需要在远程服务器上以root权限执行shell脚本。根用户无法通过SSH直接连接这些服务器。因此,我必须首先以普通用户的身份连接ssh,然后在执行脚本之前将其更改为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
#/垃圾箱/垃圾箱
用户名=管理员
密码=admin123
主机={host1..host50}
主机名,单位为$hosts;
做
ssh$username@$hostname sudo'bash-s'results.txt
完成
我该怎么做?在我当前的代码中,我需要键入管理员用户连接的密码,然后出现如下错误:
sudo:no tty present和no askpass program specified
。可能需要像
expect
这样的命令,但我在这方面没有太多专业知识

谢谢你的帮助


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

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


查看此链接:

如果可以修改远程主机上的sudoers文件,则可以告诉sudoer服务不要向特定用户询问密码以执行sudo命令

sudo-visudo

向用户添加指令
NOPASSWD


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

您可以找到一个非常类似的示例,但我在这里复制了相关的代码部分

#!/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"

我希望我能帮忙

感谢您的快速回答,但不幸的是,我无法在这些服务器中添加SSH密钥。我需要使用密码来解决这个问题(不幸的是:()…非常感谢,但不幸的是,这些服务器上不允许进行管理更改。是否可以先通过SSH连接用户,然后通过root用户执行脚本,而无需人工干预?可能使用
expect
或类似的方法?我明白了。几年前,我也遇到过同样的问题,但可以通过RSA密钥验证来解决在(ssh-i RSA_PRIV_KEY_)路径上xy@hostname ...)这不是您所说的选项…对不起,我没有主意了。这是解决我的ssh连接问题的一个很棒的解决方案。但是,还有一个改进,我需要在远程服务器上执行我的本地脚本,而不在每个服务器上复制它。这可能吗?为什么您不能复制scipt?如果存在权限问题,请使用/tmp.每个人都可以在/tmp或/var/tmp目录下编写。这是真的。在我看来,我想节省带宽并最小化网络连接,尽管你是对的,而且这样做更简单,所以我将在SSH连接之前添加一个SCP连接到
for
循环中,以便在每个服务器中复制脚本。非常感谢你宝贵的帮助!