【问题标题】:How to sudo run a local script over ssh如何 sudo 通过 ssh 运行本地脚本
【发布时间】:2017-07-05 02:50:57
【问题描述】:

我尝试 sudo 通过 ssh 运行本地脚本,

ssh $HOST < script.sh

我试过了

ssh -t $HOST "sudo -s && bash" < script.sh

其实我在google上搜索了很多,找到了一些类似的问题,但是我没有找到可以sudo运行本地脚本的解决方案。

【问题讨论】:

标签: linux shell server


【解决方案1】:

读取错误信息

$ ssh -t $HOST "sudo -s && bash" < script.sh
Pseudo-terminal will not be allocated because stdin is not a terminal.

很清楚这里出了什么问题。

在将脚本重定向到远程会话的 bash 标准输入时,您不能使用 ssh 参数 -tsudo 需要输入密码)。

如果您可以接受,您可以通过scp 将本地脚本传输到您的远程计算机,然后执行该脚本而无需 I/O 重定向:

scp script.sh $HOST:/tmp/ && ssh -t $HOST "sudo -s bash /tmp/script.sh"

解决问题的另一种方法是在非交互模式下使用sudo -n,但为此您需要在远程计算机的 sudoers 文件中为执行用户设置 NOPASSWD。然后你可以使用

ssh $HOST "sudo -n -s bash" < script.sh

【讨论】:

    【解决方案2】:

    为了使 Edward Itrich 的答案更具可扩展性并适合频繁使用,您可以设置一个系统,在该系统中您只运行一个可以通过以下方式快速移植到任何主机、文件或命令的单行脚本:

    如果您有脚本,请在您的 Scripts 目录中创建一个脚本,方法是更改​​您想要的脚本名称(我经常使用这种格式来更改我的脚本名称的 1 个单词并创建文件、设置权限并打开以进行编辑) :

    newscript="runlocalscriptonremotehost.sh"
    touch $newscript && chmod +x $newscript && nano $newscript
    

    在nano中填写脚本如下,将要远程运行的脚本的目录和名称信息放在runlocalscriptonremotehost.sh的变量行中(只需要编辑1-3行) :

    HOSTtoCONTROL="sudoadmin@192.168.0.254"
    PATHtoSCRIPT="/home/username/Scripts/"
    SCRIPTname="scripttorunremotely.sh"
    scp $PATHtoSCRIPT$SCRIPTname $HOSTtoCONTROL:/tmp/ && ssh -t $HOSTtoCONTROL "sudo -s bash /tmp/$SCRIPTname"
    

    然后运行:

    sh ./runlocalscriptonremotehost.sh
    

    在选项卡式文本编辑器中保持 runlocalscriptonremotehost.sh 打开以便快速更新,继续为脚本创建一个 bash 别名,您就拥有了这个常用操作的应用程序版本。

    【讨论】:

    • 这是一个很好的后续回答。
    【解决方案3】:

    首先将您的目标分为两部分。 1) ssh 到主机。 2) 以 sudo 运行所需的命令。在您确定可以 1) 访问主机和 2) 具有 sudo 权限之后,您可以将这两个命令与&amp;&amp; 结合使用。 x_cmd &amp;&amp; y_cmd 所做的是在x_cmd 成功退出后执行y_cmd

    【讨论】:

      猜你喜欢
      • 2018-10-30
      • 2011-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-02
      相关资源
      最近更新 更多