通过ssh运行Bash脚本

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通过ssh运行Bash脚本相关的知识,希望对你有一定的参考价值。

我正在尝试编写一个Bash脚本,它将SSH连接到一台机器并创建一个目录。长期目标有点复杂,但现在我开始变得简单了。然而,尽管很简单,我似乎无法得到它。这是我的代码:

#!/bin/bash
ssh -T tunneluser@111.222.333.444 <<EOI

# Fix "TERM environment variable undefined" error.
TERM=dumb
export TERM

# Store todays date.
NOW=$(date +"%F")
echo $NOW

# Store backup path.
BACKUP="/backup/$NOW"
[ ! -d $BACKUP ] && mkdir -p ${BACKUP}
echo $BACKUP

exit
EOI

它运行时没有任何明显的错误。但是,回显的$ NOW和$ BACKUP变量显示为空,并且未创建/ backup目录。我该如何解决?

答案

本地主机上的shell在$ NOW和$ BACKUP上进行变量替换,因为“EOI”没有被转义。更换

 ssh tunneluser@111.222.333.444 <<EOI

 ssh tunneluser@111.222.333.444 <<EOI
另一答案

正在本地计算机上的脚本中评估变量。你需要用逃脱的美元符号代替美元符号。

#!/bin/bash
ssh -T tunneluser@111.222.333.444 <<EOI

# Fix "TERM environment variable undefined" error.
TERM=dumb
export TERM

# Store todays date.
NOW=$(date +"%F")
echo $NOW

# Store backup path.
BACKUP="/backup/$NOW"
[ ! -d $BACKUP ] && mkdir -p ${BACKUP}
echo $BACKUP

exit
EOI
另一答案

您的脚本在发送之前正在本地主机上进行替换。

将您的第一行更改为:

ssh -T tunneluser@111.222.333.444 <<'EOI'

这将导致原始脚本在远程主机上发送和解释。

如果你想要混合(例如,如果你想在本地主机上执行date命令,你应该保持ssh行不变并引用单个命令):

ssh -T tunneluser@111.222.333.444 <<EOI

# Execute the date command on the local machine.  The assignment still
# happens on the remote machine
NOW=$(date +"%F")

# Quote your $ so that the replacement happens on the remote machine
echo $NOW
另一答案

How to run a local script over SSH

概要:

通过SSH执行脚本而不复制脚本文件。您需要一个简单的SSH连接和本地脚本。

码:

#!/bin/sh
print_usage() {
        echo -e "`basename $0` ssh_connexion local_script"
        echo -e "Remote executes local_script on ssh server"
        echo -e "For convinient use, use ssh public key for remote connexion"
        exit 0
}

[ $# -eq "2" ] && [ $1 != "-h" ] && [ $1 != "--help" ] || print_usage

INTERPRETER=$(head -n 1 $2 | sed -e 's/#!//')

cat $2 | grep -v "#" | ssh -t $1 $INTERPRETER

例子:

  • ssh-remote-exec root @ server1 myLocalScript.sh #for Bash
  • ssh-remote-exec root @ server1 myLocalScript.py #for Python
  • ssh-remote-exec root @ server1 myLocalScript.pl #for Perl
  • ssh-remote-exec root @ server1 myLocalScript.rb #for Ruby

一步一步的解释

此脚本执行此操作:1°捕获第一行#!获得解释器(即:Perl,Python,Ruby,Bash解释器),2°通过SSH启动远程互操作,3°通过SSH发送所有脚本体。

本地脚本:

本地脚本必须以#!/ path / to / interpreter开头 - #!/ bin / sh用于Bash脚本 - #!/ usr / bin / perl用于Perl脚本 - #!/ usr / bin / python用于Python脚本 - #! / usr / bin / ruby​​用于Ruby脚本

此脚本不是基于本地脚本扩展,而是基于#!信息。

另一答案

尝试:

NOW=`date +"%F"`

以上是关于通过ssh运行Bash脚本的主要内容,如果未能解决你的问题,请参考以下文章

Bash 脚本使用 ssh 和日期在远程系统上设置坐标世界时

如何从 bash 脚本中 ssh?

sh SSH:在远程服务器上运行本地bash脚本

如何通过 bash 脚本将 ssh 密钥添加到主机

通过 SSH 执行存储在文件中的 Bash 脚本

通过 ssh 在远程主机上启动 bash 脚本