为什么用户无法删除他们创建的文件

为什么用户无法删除他们创建的文件

重新发布有关删除文件的问题。我们有一个脚本用于在两个 SCO Unix 系统之间传输文件。该剧本多年来一直坚如磐石。最近,一处的防火墙单元发生故障并被更换。我们可以打开 VPN 隧道,FTP 可以工作,我们可以传输文件,但脚本在删除文件时卡住了。
该脚本写入一个本地文件来标识 FTP 传输正在进行(称为“锁定文件”)。该文件在文件名中使用 PID,以便脚本可以识别它。然后,在 FTP 传输之后,脚本会删除该文件,以明确指示传输过程已完成。 FTP 传输完成 - 文件已传输。屏幕上会回显一条消息,表明 FTP 会话已关闭。但脚本在删除锁定文件时停止。

此外,该脚本支持删除“过时的”锁定文件,但它也不能再这样做了。

不确定目标系统上的防火墙将如何影响本地系统,但这就是症状。

我们目前没有系统管理员。我是一名程序员,目前正在尝试填补这一空缺。我对“粘位”一无所知——这里有什么明显的吗?任何关于去哪里寻找的线索都值得赞赏。

这是脚本:

# Usage: storeftpputall machine
set -x
MACHINE=$1          # name of remote machine
USERNAME='ftpstore' 
PASS='ftppassword'      
PUBDIR='/u/ftpstore'        # Transfer directory tree
INDIR='transfer/in'     # Remote system, where files go in
MYNOWPID=$$             # Proc ID of this process.

# Make sure no other storeftpputs are running to that store, 
# else you could get an attempted overwrite, or at least overload
# the modem line.  Use PID lock files. 

# Check for PID file locking ftp to remote store
if [ -f /usr/tmp/$MACHINE.put.* ]
then
    STORELOKPID1=''
    STORELOKPID1=`ls /usr/tmp/$MACHINE.put.* | sed -e "s|$MACHINE\.put\.||g"`
    for j in $STORELOKPID1
    do
    k=`basename $j`
    LIVEPID=`ps -ef | grep $k | grep -v 'grep'`
    if [ -n "$LIVEPID" ]
    then
        echo 'Storeftpput script already in progress. Please wait'
        sleep 2
    else
        echo "Removing stale lockfile $MACHINE.$k"
        rm "/usr/tmp/$MACHINE.put.$k"   # Remove stale lock file
        sleep 2
    fi
    done
fi

# Any stale locks should be gone. Wait for any live
# storeftpput scripts to finish and remove their own lockfiles, 
# then proceed. 
while [ -f /usr/tmp/$MACHINE.put.* ]
do
    echo 'Storeftpput script already in progress. Please wait.'
    echo "Retrying at 45 second intervals."
    sleep 45
done

# Assert own lockfile on line
touch /usr/tmp/$MACHINE\.put\.$MYNOWPID
chmod 664 /usr/tmp/$MACHINE\.put\.$MYNOWPID

# Check for outbound store files. If found, send them. 
cd $PUBDIR/out/$MACHINE
if [ -f *.tar.Z ]
    then

    NUMBER=`ls *.tar.Z|sed -e "s|\.tar\.Z||g"`      # Get tar file numbers
    for j in $NUMBER   # May be more than one
    do
    ftp -i -n -v $MACHINE <<-EndFTP 
        user $USERNAME $PASS
        cd $INDIR
        lcd $PUBDIR/out/$MACHINE
        binary
        hash
        put $j.tar.Z
        chmod 666 $j.tar.Z
        close
        EndFTP
    rm $j.tar.Z
    done
fi

# Remove storeftpput lockfile
rm /usr/tmp/$MACHINE\.put\.$MYNOWPID

echo "Done..."
sleep 1

答案1

为什么你使用这样的路径:/usr/tmp/$MACHINE.put.$MYNOWPID,

你不应该使用 /usr/tmp/$MACHINE/.put/.$MYNOWPID

答案2

没有什么明显的...但是

问题中没有说明实际的消息,但从上下文来看,这听起来像是此评论后的循环

# Any stale locks should be gone. Wait for any live

该脚本有一些可能的问题:

  • 它对测试操作符的使用。如果这些表达式中的通配符匹配多个项目,则脚本可能会崩溃:
    如果 [ -f /usr/tmp/$MACHINE.put.* ]
    而[ -f /usr/tmp/$MACHINE.put.* ]
    如果 [ -f *.tar.Z ]
  • 在 sed 表达式中使用(甚至引用)shell 特殊字符,例如,
    NUMBER=`ls *.tar.Z|sed -e "s|\.tar\.Z||g"` # 获取 tar 文件编号

根据主机系统的不同,sed可能表现不佳(其他脚本通常使用逗号或百分号,以避免出现模糊问题)。

相关内容