在 ssh 会话中使用本地和远程变量

在 ssh 会话中使用本地和远程变量

我正在编写一个脚本,该脚本应该在远程服务器上处理完一些文件后向我发送这些文件。为此,我需要来自执行脚本的本地服务器的变量,以及稍后远程服务器的一些变量。

我尝试了在 上找到的几种方法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。如果您想要扩展,请去掉引号。但是,当您这样做时,您必须在$您想要的每个字符之前添加反斜杠偏僻的壳来展开。

使用-qssh/scp 的(安静)选项可能会更简单,并将脚本的输出减少到可以轻松重定向到变量中的内容。

答案2

除了检查文件之外,您似乎不需要在远程系统上运行命令。因此,不要运行远程命令来检查文件,而是在本地计算机上挂载远程文件系统,并使用本地命令来检查远程和本地文件。要挂载通过 SSH 访问的远程文件系统,请使用SSHFS

mkdir remote
sshfs "$remoteServer": remote
cd "$remoteServer/$someID"
for file in */*; do …
fusermount -u remote

相关内容