猿问

ssh在bash中突破了while-循环。

ssh在bash中突破了while-循环。

我使用这个bash代码将文件上传到远程服务器,对于普通文件来说,这很好:

for i in `find devel/ -newer $UPLOAD_FILE`do
    echo "Upload:" $i    if [ -d $i ]
    then
        echo "Creating directory" $i
        ssh $USER@$SERVER "cd ${REMOTE_PATH}; mkdir -p $i"
        continue
    fi
    if scp -Cp $i $USER@$SERVER:$REMOTE_PATH/$i    then
        echo "$i OK"
    else
        echo "$i NOK"
        rm ${UPLOAD_FILE}_tmp    fidone

唯一的问题是,对于名称中有空格的文件,for-循环失败,所以我替换了第一行,如下所示:

find devel/ -newer $UPLOAD_FILE | while read ido
    echo "Upload:" $i    if [ -d $i ]
    then
        echo "Creating directory" $i
        ssh $USER@$SERVER "cd ${REMOTE_PATH}; mkdir -p $i"
        continue
    fi
    if scp -Cp $i $USER@$SERVER:$REMOTE_PATH/$i    then
        echo "$i OK"
    else
        echo "$i NOK"
        rm ${UPLOAD_FILE}_tmp    fidone

由于一些奇怪的原因,ssh命令脱离了while-循环,因此第一个丢失的目录被创建得很好,但是所有随后丢失的文件/目录都被忽略了。

我想这与ssh编写一些混淆了“read”命令的stdout有关。注释掉ssh-命令使循环按其应有的方式工作。

有谁知道为什么会发生这种情况,以及如何防止ssh中断while-循环?


摇曳的蔷薇
浏览 456回答 3
3回答

慕运维8079593

问题是ssh从标准输入中读取,因此它占用了所有剩下的行。您只需将它的标准输入连接到任何地方:ssh&nbsp;$USER@$SERVER&nbsp;"cd&nbsp;${REMOTE_PATH};&nbsp;mkdir&nbsp;-p&nbsp;$i"&nbsp;<&nbsp;/dev/null您也可以使用ssh -n而不是重定向。

慕田峪7331174

顺便说一句,这辆车还不错。万一$1是带有空格的文件名吗?最后创建多个目录。类似于$REMOTE_PATH.&nbsp;printf %q可以用来引用变量,以便安全地通过ssh调用的额外shell传递。
随时随地看视频慕课网APP

相关分类

Python
我要回答