为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

摇曳的蔷薇 2019-07-03 16:58:18
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-循环?
查看完整描述

3 回答

?
慕运维8079593

TA贡献1876条经验 获得超5个赞

问题是ssh从标准输入中读取,因此它占用了所有剩下的行。您只需将它的标准输入连接到任何地方:

ssh $USER@$SERVER "cd ${REMOTE_PATH}; mkdir -p $i" < /dev/null

您也可以使用ssh -n而不是重定向。


查看完整回答
反对 回复 2019-07-03
?
慕田峪7331174

TA贡献1828条经验 获得超13个赞

顺便说一句,这辆车还不错。万一$1是带有空格的文件名吗?最后创建多个目录。类似于$REMOTE_PATHprintf %q可以用来引用变量,以便安全地通过ssh调用的额外shell传递。

查看完整回答
反对 回复 2019-07-03
  • 3 回答
  • 0 关注
  • 455 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信