Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell 使用SSH删除远程服务器上多个目录中的文件_Shell_Ssh - Fatal编程技术网

Shell 使用SSH删除远程服务器上多个目录中的文件

Shell 使用SSH删除远程服务器上多个目录中的文件,shell,ssh,Shell,Ssh,我编写了一个脚本来删除远程服务器上的文件。存在多个目录,脚本将移动到每个目录,并查找早于定义时间的文件并将其删除。但是,如果脚本找到要删除的文件,它将删除这些文件并退出while循环 输入:目录列表文件,其中包含目录列表和文件名 下面是代码 MsgLog " Step 1: Start checking directories for old logs" cat $DIRECTORY_LIST | while read DIR; do read LOG_FILE read LOG_RET_PER

我编写了一个脚本来删除远程服务器上的文件。存在多个目录,脚本将移动到每个目录,并查找早于定义时间的文件并将其删除。但是,如果脚本找到要删除的文件,它将删除这些文件并退出while循环

输入:目录列表文件,其中包含目录列表和文件名

下面是代码

MsgLog " Step 1: Start checking directories for old logs"
cat $DIRECTORY_LIST | while read DIR;
do
read LOG_FILE
read LOG_RET_PERIOD

MsgLog "Inputs"
MsgLog "Server=$SERVER User=$USER Log_path=$DIR Log_file=$LOG_FILE Log_Retention_Period=$LOG_RET_PERIOD"

                ssh -q -n -o 'BatchMode yes' $USER@$SERVER "cd $DIR;find $LOG_FILE* -mtime +$LOG_RET_PERIOD" >>$FIND_log

                ERROR_MSG=$?
                        if [ $ERROR_MSG -ne 0 ]
                        then
                                MsgLog "ERROR $ERROR_MSG: Could not connect."
                                exit 1
                        fi

                if [ -s "$FIND_log" ]
                        then
                        MsgLog "  Files to delete:"
                        cat $FIND_log
                        ssh $USER@$SERVER "cd $DIR;find $LOG_FILE* -mtime +$LOG_RET_PERIOD -exec rm {} \;"
                        ERROR_MSG=$?
                        if [ $ERROR_MSG -ne 0 ]
                        then
                                MsgLog "ERROR $ERROR_MSG: Step 1, Could not delete old Log Files."
                                exit 1
                        fi
                else
                        MsgLog "  No log files to delete."
                fi
        rm $FIND_log
        MsgLog "Move to next directory"
done
MsgLog "No more directories"

if [ "$EXIT_CODE" = 0 ]
then
  MsgLog "$BNAME successfully completed"
else
  MsgLog "$BNAME completed with errors"
fi

exit $EXIT_CODE

我希望它循环到所有目录。但是,当它从任何目录中查找并删除文件时,就会退出循环。

问题在于在读取目录时使用
cat$directory\u LIST中的
read

read
的某些实现上,特别是在RedHat派生的发行版上,
read
是一个shell脚本,当shell发生更改时,其输出会重置

由于shell在每次
ssh
登录到另一台主机时都会发生更改,因此循环在第一次
ssh
调用后停止

将顶部循环更改为不使用
读取的内容,例如:

for DIR in `cat $DIRECTORY_LIST`; do
<..>
done
用于'cat$DIRECTORY_LIST'中的目录;做
完成

问题在于在读取目录时在
目录列表中使用
read

read
的某些实现上,特别是在RedHat派生的发行版上,
read
是一个shell脚本,当shell发生更改时,其输出会重置

由于shell在每次
ssh
登录到另一台主机时都会发生更改,因此循环在第一次
ssh
调用后停止

将顶部循环更改为不使用
读取的内容,例如:

for DIR in `cat $DIRECTORY_LIST`; do
<..>
done
用于'cat$DIRECTORY_LIST'中的目录;做
完成

但我的目录列表在一行中有路径名,在下一行中有文件名,在下一行中有保留期,依此类推。每个文件的文件名和保留期都会更改。然后,您还需要将
read
的那些用法替换为其他用法。在上述情况下,仅当
read
的值正在循环中使用时。非常感谢。我替换了所有的“读取”命令。它正在工作!太棒了,很高兴它起作用了。如果回答了您的问题,请接受答案;)但我的目录列表在一行中有路径名,在下一行中有文件名,在下一行中有保留期,依此类推。每个文件的文件名和保留期都会更改。然后,您还需要将
read
的那些用法替换为其他用法。在上述情况下,仅当
read
的值正在循环中使用时。非常感谢。我替换了所有的“读取”命令。它正在工作!太棒了,很高兴它起作用了。如果回答了您的问题,请接受答案;)