我正在编写一个脚本,该脚本应该在远程服务器上处理完一些文件后向我发送这些文件。为此,我需要来自执行脚本的本地服务器的变量,以及稍后远程服务器的一些变量。
我尝试了在 上找到的几种方法Stack Exchange
,到目前为止没有一个对我有用。
这列出了初始脚本:
#!/bin/bash
set -x
export someID=$1
LOG=/folder/subfolder1/$someID/tmp/getResult.log
export DIR=/folder/subfolder1/$someID
export rc=0
export lServ=`hostname`
case $lServ in
test.server*)
remoteServer=remote.test.server
;;
prod.server*|backup.server*)
remoteServer=remote.prod.server
;;
esac
cd $DIR
ssh -v $remoteServer << 'EOF' >> $LOG 2>&1
cd $someID
folders=`ls`
for file in $folders; do
case $file in
*.1)
scp -v $file/outputFolder/$file.someExt $lServ:$DIR/p.someExt
rc=`expr $rc + $?`
;;
*)
export subID=`echo $file | awk -F"." '{print $2}'
scp -v $file/outputFolder/$file.ext $lServ:$DIR/k$subID.someExt
rc=`expr $rc + $?`
;;
esac
done
case $rc in
0)
cd ..
rm -rfv $someID
export rc=$?
;;
*)
echo "some Errormessage"
rc=`expr $rc + 1`
;;
esac
EOF
rc=`expr $rc + $?`
exit $rc
由于公司限制,我无法发布真实姓名或文件夹结构。
答案1
您的脚本中缺少的部分似乎是变量rc
。您的脚本(大部分)正在本地计算机上运行,因此您可以
- 制作一个临时文件名外部重定向的部分,
- 使用那个名字里面重定向的部分,以及
- 回显
$rc
到临时文件中,并且 - 读取有向部分之外的变量。
对于临时文件名,通常使用 完成mktemp
,因此这些片段可能看起来像
- 外部
mytemp=$(mktemp) 陷阱“rm -f $mytemp” EXIT HUP INT QUIT
- 里面
# 从 `SSH_CLIENT` 获取我的 IP 地址 my_addr=\$(echo "\$SSH_CLIENT" |awk '{printf \$1;}') 结果=\$(mktemp) echo "\$rc" >\$结果 scp \$结果\$my_addr:$mytemp rm -f \$结果
- 外部
rc=$(猫$mytemp)
未从本地服务器传递到远程的原因$someID
是您的此处文档以
ssh -v $remoteServer << 'EOF' >> $LOG 2>&1
有引标记'EOF'
,告诉 shell 在将字符串传递给命令之前不要扩展该字符串ssh
。如果您想要扩展,请去掉引号。但是,当您这样做时,您必须在$
您想要的每个字符之前添加反斜杠偏僻的壳来展开。
使用-q
ssh/scp 的(安静)选项可能会更简单,并将脚本的输出减少到可以轻松重定向到变量中的内容。
答案2
除了检查文件之外,您似乎不需要在远程系统上运行命令。因此,不要运行远程命令来检查文件,而是在本地计算机上挂载远程文件系统,并使用本地命令来检查远程和本地文件。要挂载通过 SSH 访问的远程文件系统,请使用SSHFS。
mkdir remote
sshfs "$remoteServer": remote
cd "$remoteServer/$someID"
for file in */*; do …
fusermount -u remote