我正在尝试编写一个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目录。我该如何解决这个问题?
答案 0 :(得分:29)
本地主机上的shell在$ NOW和$ BACKUP上进行变量替换,因为“EOI”没有被转义。取代
ssh tunneluser@111.222.333.444 <<EOI
与
ssh tunneluser@111.222.333.444 <<\EOI
答案 1 :(得分:16)
正在本地计算机上的脚本中评估变量。你需要用逃逸的美元符号来代替美元符号。
#!/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
答案 2 :(得分:6)
您的脚本在发送之前正在本地主机上进行替换。
将您的第一行更改为:
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
答案 3 :(得分:0)
通过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
此脚本执行此操作: 1°抓住第一线#!得到解释器(即:Perl,Python,Ruby,Bash解释器), 2°通过SSH启动远程互操作, 3°通过SSH发送所有脚本体。
本地脚本必须以#!/ path / to / interpreter开头 - 用于Bash脚本的#!/ bin / sh - Perl脚本的#!/ usr / bin / perl - Python脚本的#!/ usr / bin / python - Ruby脚本的#!/ usr / bin / ruby
此脚本不是基于本地脚本扩展,而是基于#!信息。
答案 4 :(得分:-1)
尝试:
NOW=`date +"%F"`