创建家庭云的历史。 第3部分。创建个人云-安装和配置Nextcloud

在创建自己的云服务的过程中,我们习惯了Debian系统创建了Web服务器 。 现在是最后一步的时候了-基于Nextcloud服务器创建和配置个人云。





目录


第1部分。设置日常使用的Debian环境
第2部分。创建服务器-在Debian中设置LAMP
第3部分。创建个人云-安装和配置Nextcloud
第4部分。更新2018-Debian 9和Nextcloud 13
第5部分。更新2019-PHP 7.2,MariaDB 10.4和Nextcloud 17



快速章节导航


前言
准备服务器以安装Nextcloud
安装Nextcloud
组织Nextcloud存储
从局域网配置Nextcloud虚拟机访问
Nextcloud设定
先进的Nextcloud微调
保护Nextcloud
智能手机云同步
个人计算机云同步
后记



前言


因此,我们来到了一切开始的阶段,而我们并没有迅速前进。 本部分将介绍在VMWare虚拟机中配置Nextcloud服务器的安装和要点,以及以同步一对台式机上基于Windows的智能手机和文件夹的内容的形式使用它的一些经验。 以下针对Nextcloud的安装说明暗指该服务已部署在根据我的故事上半部分的说明创建的服务器上。

最初,本章计划很小,因为我只想将自己限于安装和配置Nextcloud的描述,本质上结束了有关“仅针对特定任务进入Linux”的故事。 但是,考虑到这可能对某人来说似乎很有趣,因此他决定向我展示如何解决我的家用计算机文件夹同步问题,因此最后一章顺利地从清晰的指令中汲取了关于编程的内容和方法。 这就解释了这一部分中的“烦恼”-从Linux中的工作和设置开始,一直到网络和虚拟软件设置的级别,最后以Windows中的计划拐杖结束。 另一方面,这一系列文章的标题是“创造的历史……”,我决定讲到最后。

注意事项
进一步阅读http:// 127.0.0.1(https:// 127.0.0.1)格式的构造后,进入浏览器地址栏时必须删除http://(https://)后面的空格。 发布本文时插入了一个空格,以防止引擎自动将文本转换为链接。



准备服务器以安装Nextcloud


Nextcloud是一个Web应用程序,具有一组文件并可以与给定的MySQL数据库一起使用。 该Web应用程序作为常规站点安装,要进行安装,您需要将其“引擎”文件上传到服务器,运行安装文件,并指定在安装过程中访问以前为此站点创建的数据库的详细信息。

创建一个目录,将在其中放置Nextcloud文件:
#mkdir / var / www / nextcloud

我决定拒绝HTTP,只允许通过HTTPS访问。 为此,您需要配置apache。

打开文件:
#nano /etc/apache2/sites-available/default-ssl.conf
在标记之前,添加以下内容:

<Directory /var/www/nextcloud> Options FollowSymLinks AllowOverride All Require all granted </Directory> 


禁用HTTP配置:
#a2dissite 000-default.conf

关闭端口80:
#ufw删除允许80

并重新启动Web服务器:
#服务apache2重新启动

现在,您需要为nextcloud创建一个数据库。 我们通过输入mysql超级用户的密码来输入mysql:
#mysql -u root -p

创建一个名为nextcloud的数据库:
mysql>创建数据库`nextcloud`;

创建一个名称为nextcloud且密码为nc123的用户:
mysql>创建用户'nextcloud'@'本地主机'由'nc123'标识;

我们授予nextcloud用户对nextcloud数据库的完全访问权限:
mysql>在`nextcloud`上授予所有特权* TO'nextcloud'@'localhost';

更新权限表:
mysql>冲洗特权;

退出mysql:
mysql:mysql>退出

另外,您需要为PHP安装其他模块:
#apt-get install curl libcurl3 libcurl3-dev php5-curl
#a2enmod重写

在本故事的第一部分中,我们打开了用于网络和邮件交互的端口,但是对于我们的目标而言,它们不是必需的,最好关闭它们。 删除规则:
#ufw删除允许138 / udp
#ufw delete allow 139 / udp
#ufw delete allow 139 / tcp
#ufw delete allow 445 / tcp
#ufw删除允许25
#ufw删除允许465
#ufw删除允许110
#ufw删除允许143
#ufw删除允许993



安装Nextcloud


下载文件并将其解压缩到预期目录中:
#wget download.nextcloud.com/server/releases/nextcloud-11.0.2.tar.bz2
#tar xjf nextcloud-11.0.2.tar.bz2 -C / var / www

更改文件夹权限:
#chmod 755 / var / www / nextcloud

并且我们为该文件夹的所有者分配了一个Web服务器,以便对其进行写入没有问题:
#chown -R www-data:www-data / var / www / nextcloud

仅此而已! 该服务已安装,如果您在浏览器中输入https:// 127.0.0.1/nextcloud,则将打开安装向导。 但是,让我们等待一下,之前已经准备好了一个用于存储用户数据的地方。

值得一提的是,Nextcloud版本11.0.2当前已经过时,并且包含较新版本和较新版本中不存在的漏洞,因此,如果安装11.x分支,则最好安装更新版本(在2018年初-此版本11.0.7)。



组织Nextcloud存储


这部分是可选的,可以跳过而不会出现问题-没有它,一切都会起作用。 但是,如果要在虚拟机外部建立数据目录,建议您熟悉一下它。

默认情况下,同步内容将存储在目录/ var / www / nextcloud / nxcdata中。 由于多种原因,此选项不适合我。 一方面,我不想不断增加虚拟磁盘的文件大小。 另一方面,我想拥有一个独立于虚拟机的数据存储解决方案。 立即想到的最简单的事情是使用USB驱动器。 如果没有足够的空间,则只需更换驱动器即可。 如有必要,可以将其连接到另一台计算机并下载必要的文件。 移动方便。 但是,由于现代标准的带宽相对较小,我不希望使用USB 2.0,并且USB 3.0无法成功使用-虚拟化软件(WMVare和VirtualBox)通常不希望转发通过USB 3.0控制器连接的设备。

在创建云的过程中,我的胃口增加了,我的容量不低于1 TB,因此最终,我决定将常规的2 TB硬盘驱动器连接到虚拟机,该虚拟机已经在计算机内部定位并连接。 如有必要,可以毫无问题地将其拔出,并通过现有的SATA <-> USB 3.0适配器进行连接。

因此,主要思想是组织一个永久点来连接目录与/ var / www / nextcloud目录之外的用户内容,在目录中创建一个名为nxcdata的符号链接,引用一个可以以各种方式在不同媒体上连接的真实数据目录。

创建目录:
#mkdir / mnt / nxcdata

我们更改权利:
#chmod 770 / mnt / nxcdata

我们使Web服务器拥有者:
#chown www-data:www-data / mnt / nxcdata

我可以将数据放置在任何地方,主要是将符号链接放置到/ mnt / nxcdata目录中,并将其命名为nxcdata,即 完整路径将类似于/ mnt / nxcdata / nxcdata。

首先,我测试了在主目录中创建的本地文件夹的解决方案。

在正确的位置创建了一个文件夹:
$ mkdir /家庭/用户/ nxcdata

更改了权限:
#chmod 755 /家庭/用户/ nxcdata

拥有Web服务器:
#chown -R www-data:www-data / home / user / nxcdata

创建一个符号链接:
#ln -s /家庭/用户/ nxcdata / mnt / nxcdata / nxcdata

该解决方案是可行的,因此您可以继续进行。 外部数据目录可以通过两种方式连接-通过VMWare共享服务或直接作为物理磁盘或分区。 应该理解,只有在安装了vmware工具的情况下,第一种解决方案才有可能,只有在存在操作系统的图形界面的情况下,安装才不会出现问题(否则,您将不得不编辑vmware工具的安装脚本)。 如果我们放弃图形界面,那么仅存在将驱动器直接连接到虚拟机的选择,但是使用这种解决方案,我不得不承受很多痛苦。 一段时间后,考虑到发明了通用脚本(结合了两个连接选项),我仍然找到了一个稳定的工作版本。

对于通过虚拟机设置的“共享文件夹”部分中的“ VMWare共享文件夹”连接的文件夹,您需要从主机系统连接必要的文件夹,并将其命名为vmw-nxcdata。 该文件夹可以指向硬盘上的某个目录,也可以直接指向主机系统上某个磁盘的根目录。

安装的文件夹将自动沿着路径/ mnt / hgfs / vmw-nxcdata出现在虚拟系统中。 但是,问题在于Web服务器将没有足够的权限来沿该路径写入文件,并且系统的标准方法无法将权限重新分配给该目录。 因此,我不得不弄清楚如何手动安装此类资源。

创建一个文件夹:
#mkdir / mnt / vmw-nxcdata

我们使用vmhgfs模块安装,该模块随vmware-tools一起安装:
#mount -t vmhgfs -o uid = www-data,gid = www-data,fmask = 007,dmask = 007 .host:/ vmw-nxcdata / mnt / vmw-nxcdata

为了将来无故障运行Web服务器,需要准确地使用这些参数执行安装。 最初,我在安装时未指定uid / gid和masks,但是后来却没有任何好处,因为安装后无法更改权限。 完成安装后,它可能显示:“无法将条目添加到mtab,继续”,但是它将安装并工作。

很好,我们挂载了目录。 现在,您可以在/ mnt / nxcdata中放置指向此目录的符号链接。 但是我不想每次启动或重新启动服务器时都手动执行此操作。 最简单的方法是在/etc/rc.local文件中输入上述命令,将其安装到“ exit 0”行。 但是,我希望在关闭虚拟机时进行自动卸载,以实现可靠的数据安全性。 而且我决定在服务级别上做所有事情,并稍微处理一下init / update-rc机制,这让我感到非常好奇,结果发现它非常有趣。

以下操作的含义是创建一个系统服务,该系统服务将在系统打开或关闭时被调用并执行预定义的命令。 该服务由根据某些规则编译的脚本描述,位于/etc/init.d中。 INIT INFO块位于脚本的最开始,并且包含服务信息,我想在其中提及Default-Start和Default-Stop指令-它们指定了默认情况下应启动或停止脚本的执行级别。

执行级别:

0-系统关闭时执行脚本
1-在单用户模式下系统启动时执行脚本
2-在多用户模式下系统启动时执行脚本
3-5-保留
6-系统重新启动时执行脚本

编写脚本后,将使用update-rc机制激活该脚本,该机制实际上在必要的目录/etc/rc0.d-/etc/rc6.d中创建了指向脚本的链接,其目录与运行级别执行的任务相对应。 可以独立创建链接,但是与启用或禁用apache Web服务器配置不同,您需要在此处考虑许多细微差别,因此需要通过update-rc启用或禁用该服务。

因此,创建一个文件:
#nano /etc/init.d/nxcdata_automount.sh

并将以下内容写入其中:

 #!/bin/sh # nxcdata_automount.sh 1.0 ### BEGIN INIT INFO # Provides: myscript # Required-Start: # Required-Stop: # Default-Start: 1 2 3 4 5 # Default-Stop: 0 6 # Short-Description: nxcdata_automount.sh 1.0 # Description: nxcdata_automount.sh 1.0 ### END INIT INFO . /lib/lsb/init-functions # Start actions perform_start() { log_daemon_msg «Start nxcdata_automount» sleep 30 mount -t vmhgfs -o uid=www-data,gid=www-data,fmask=007,dmask=007 .host:/vmw-nxcdata /mnt/vmw-nxcdata #mount -t ntfs-3g -o uid=www-data,gid=www-data,fmask=007,dmask=007 /dev/sdb1 /mnt/sdb1 #mount -t ext4 /dev/sdb1 /mnt/sdb1 sleep 5 service fail2ban restart log_end_msg 0 return 0 } # Stop actions perform_stop() { log_daemon_msg «Stop nxcdata_automount» umount /mnt/nxcdata log_end_msg 0 return 0 } case $1 in start) perform_start ;; stop) perform_stop ;; *) echo “Usage: /etc/init.d/myscript {start|stop}” exit 3 ;; esac 


在perform_start部分中注意几个被注释掉的团队-这是我们未来的基础。 此外,安装后,fail2ban服务将重新启动。

矛盾的是,一年之后,我不再记得为什么要这样做了,但是我非常怀疑这样做是那样的。 显然,在安装服务后,由于某种原因,服务最初崩溃或无法启动,必须​​手动重新启动。

分心之后,我们继续进行进一步配置。 创建一个符号链接:
#ln -s / mnt / vmw-nxcdata / mnt / nxcdata / nxcdata

我们使脚本可执行:
#chmod + x /etc/init.d/nxcdata_automount.sh

将脚本添加到启动:
#update-rc.d nxcdata_automount.sh默认

我们重新引导系统,并确保自动挂载成功,并且可以正确方式访问所有内容。

要删除该脚本,您将需要运行以下命令:
#update-rc.d -f nxcdata_automount.sh删除
#rm -f /etc/init.d/nxcdata_automount.sh

如果不通过VMWare共享文件夹安装驱动器,则应直接执行与通过VMWare共享文件夹安装驱动器相同的步骤,但要考虑到系统中将出现第二个完整的驱动器。 如何找出驱动器号?

大多数Linux块设备通过SCSI接口连接,因此在大多数情况下,磁盘将以字母sd开头。 磁盘名称中的第三个字母表示其在系统中的序列号,并按字母顺序表示:sda-第一个磁盘,sdb-第二个磁盘,sdc-第三个磁盘,依此类推。 然后是定义磁盘上分区号的数字:sda1,sda2等。 查看所有映射驱动器的最简单方法是查看/ dev /目录的内容并过滤出sd设备:

$ ls -l / dev / | grep sd

例如,我们需要将sdb1驱动器与NTFS文件系统连接。

创建一个目录并将磁盘装入其中:
#mkdir / mnt / sdb1
#mount -t ext4 / dev / sdb1 / mnt / sdb1

创建数据目录,设置其权限和用户:
#mkdir / mnt / sdb1 / nxcdata和chmod 770 / mnt / sdb1 / nxcdata和chown -R www-data:www-data / mnt / sdb1 / nxcdata

接下来,您还需要创建一个用于自动挂载的脚本,并在脚本中调整mount命令(脚本中已包含使用NTFS和EXT4连接驱动器的示例,并已将其注释掉),并将该脚本添加到自动加载中。

B创建一个指向数据目录的符号链接:
#ln -s / mnt / sdb1 / nxcdata / mnt / nxcdata / nxcdata

实际上,一堆nxcdata目录带来的所有麻烦都是为一件事而设计的:将来提供对数据目录的简单传输-您将无需在Nextcloud引擎中编辑配置,并且通常无需进入其中-您所需要做的就是连接新磁盘,复制到他数据,并重新创建一个符号链接,该链接指向包含数据的新目录。 同时,所有操作都不会超出/ mnt目录。 因此,一切都变得很复杂,我只是不想失去自己拥有的解决方案。

在虚拟机外部传输数据的最佳方法是什么? 我将分享我停止使用哪个选项以及原因的经验。

当虚拟机启动,正确,完全地将其扔进内部时,USB驱动器会被自动捕获,并且一切正常,但直到由于某种原因将该驱动器与系统断开连接为止。 重新引导或物理断开连接和磁盘连接均有所帮助。 最终决定是不可靠的。 闪存驱动器没有这种问题,但是它们的数量和工作速度绝对不适合我。 也许值得尝试使用自主电源的外部驱动器。

通过VMWare共享文件夹进行目录转发的过程稳定且完美。 该解决方案完全满足了同步两个智能手机的任务。 一切工作了几天,抽出了数十GB的数据。 但是,当我决定将数据从计算机添加到云时,突然发现路径和文件名过长。 理论上,NTFS文件/文件夹的名称限制为255个字符,但实际上Windows API将其限制为244个字符。 从理论上讲,NTFS中文件或文件夹的路径长度限制为32767个字符,但实际上,Windows API将其限制为245个字符。 鉴于我是信息结构的忠实拥护者,因此我的发展之路可能非常漫长。 书籍的未缩写标题也可以轻松地为100-150个字符,包括空格。 此限制是VMWare共享文件夹的已知问题,即使将Windows 10与注册表中的各种巧妙键一起使用以删除255个字符限制,也无法解决。 可能的原因是vmhgfs的限制。 必须放弃这种方便的连接方式。 可以肯定地解决问题的原因-问题出在虚拟文件系统中,该文件系统用于VMWare共享文件夹机制中。

下一个解决方案是将硬盘驱动器直接连接到虚拟机。 它也没有顺利解决。 当磁盘或其分区被虚拟机软件“捕获”时,或者即使将其全部转移到主机系统中时,数据结构(或文件系统,对于NTFS和EXT2 / 3/4都是显而易见的)不断崩溃。在主机系统上脱机驱动器。 在某些模式下,我不会写入或读取数据-我什至无法正确格式化转发的硬盘或分区。 但是,我们设法找到了一种工作模式:具有一个分区(以NTFS格式化)的物理硬盘以某种连接模式连接到虚拟机:SATA /独立/永久/使用单个分区。 包含数据的nxcdata文件夹应位于硬盘驱动器上。



从局域网配置Nextcloud虚拟机访问


我们在虚拟机或主机系统中打开网站没有问题。 但是如何从本地网络上的另一台计算机打开创建的站点? 让我们看一下我们的网络结构,如下所示。



如图所示,路由器直接连接到Internet并进行了配置,以便它自动将IP地址分配给所连接设备的192.168.0.2-192.168.0.254范围。 地址192.168.0.2被我们的计算机接收,而192.168.0.3-我们在其上作为服务器的第二台计算机。 但是,第二台计算机上安装了虚拟化软件,该计算机创建了自己的虚拟路由器并在192.168.233.0/24子网中配置了DHCP 。 我们的虚拟服务器收到IP 192.168.133.138。

我可以轻松地在虚拟机192.168.233.138中打开该站点。 只需在浏览器中输入所需的IP地址,我就可以轻松地从192.168.0.3机器上打开该站点-虚拟化软件已经照顾了主机上网络环境的正确配置。 但是,如何从计算机192.168.0.2到达站点? 如果输入IP地址192.168.233.138,则不会打开任何文件,因为我的计算机和真实路由器都不了解此子网。 如果输入地址192.168.0.3,则也不会打开任何文件,因为此计算机上确实没有站点-它位于其虚拟机内部。

要解决此问题,您需要配置计算机192.168.0.3的虚拟路由器。 我们已经知道对站点的访问在端口80和443上进行。访问这些端口到计算机192.168.0.3时,我们需要建立路由,以便将请求重定向到虚拟机192.168.233.138。 为此,我们有可用的工具。 VMWare Workstation具有一个虚拟网络编辑器工具,可以从虚拟机菜单中打开(编辑->虚拟网络编辑器)。



该工具使您可以非常灵活地管理网络设置。 我们需要选择虚拟网卡VMNet8,然后单击可用的“ NAT设置...”按钮。 在打开的窗口中,您需要添加规则来创建所需的路由。



指定主机系统端口,然后指定应将请求重定向到的虚拟机的IP地址和端口。 要转发HTTPS通信,必须指定主机系统端口443和端口443,以及虚拟机的地址192.168.233.138。 创建规则后,在所有窗口中单击“确定”-虚拟网络环境将自动重新配置。

进行这些更改之后,访问地址192.168.0.3时,我们的站点将从192.168.0.2机器开始打开。

端口转发的类似设置不仅适用于VMWare,而且适用于VirtualBox(设置→网络→选择所需的适配器→高级→端口转发)。 但是,在将硬盘驱动器连接到此阶段的实验过程中,我发现安装了免费的VMWare Player,但没有安装Virtual Network Editor。 我在Internet上找不到有关VMWare Player的端口转发的任何信息,我不得不使用VMWare Workstation的试用版-安装产品时,它提供30天的免费使用时间。 30天后,可以卸下,清洁和重新安装产品,但是对服务器的这种关注在某种程度上是多余的,显然是不可取的。然后我去了一个小(或大)技巧。 VMWare Workstation文件集包含vmnetcfg实用程序,该实用程序实际上通过“虚拟网络编辑器”项运行。但是,它不在VMWare Player文件集中。但是,在安装VMWare Player时,是否可以以某种方式配置其网络环境?我只是使用了该实用程序,并使用VMWare Player将其复制到文件夹中,然后启动了它。令人惊讶的是,一切顺利。 VMWare Player环境中的瘦网络设置可能无法使用,但是提供了端口转发功能,我不需要更多功能。

要从Internet访问我们的服务器,您需要以相同的方式转发连接到Internet的路由器上的端口。在绝大多数路由器的固件中,都有一个“端口转发”部分,您可以在其中指定外部端口以及内部计算机的端口和IP地址来配置路由。但是,有一些细微差别。如果提供商为我们提供了真实的IP地址或我们从他那里购买了IP地址,那么就不会有问题-我们从世界任何地方的计算机上输入该IP地址,真实的路由器会将流量重定向到具有虚拟机的计算机,虚拟路由器将在虚拟机上将流量直接重定向到虚拟机一辆车。但是,对于没有机会获得真实IP地址并且获得动态地址或在NAT之后的人该怎么办提供商,获取“灰色” IP地址?因为我有一个静态的“白色” IP,所以我不必解决这个问题。任何必须以一种或另一种方式解决此问题的人都必须处理此问题。对于动态地址,我建议您朝dyndns或freedns.afraid.org方向发展,或者购买便宜的VDS来尝试自己进行某种路由,因为在任何情况下,如果没有具有静态IP地址的外部服务器,都无法解决此问题。

配置路由后,我固定了计算机192.168.0.3和192.168.233.138的IP地址,将它们手动写入这些计算机的网卡设置中,以排除它们的自动重新分配。



Nextcloud设定


现在是时候在虚拟机内部的浏览器中打开https:// // 127.0.0.1/nextcloud,从主机系统https:// // 192.168.233.138/nextcloud,或者根据上述配置的路由,从任何系统打开https:// 192.168.0.3/nextcloud本地网络上的计算机。

接下来,我们为管理员设置登录名/密码,访问先前创建的数据库,并作为存储位置,指定nxcdata目录的完整路径:/ mnt / nxcdata / nxcdata。此设置步骤与安装站点没有什么不同。

在管理设置中,我进行了以下简单更改:

-个人→选择俄语,并为管理员用户@ localhost指定一封电子邮件
-管理→常规访问→禁用所有项目
-管理→使用情况调查→禁用所有项目
-管理→高级设置→文件管理:“最大上传文件大小”设置为25 GB-
用户→创建用户组并向其中添加新用户用户

设置后,需要启用缓存。

打开文件:
#nano /var/www/nextcloud/config/config.php

最后,在“);”之前。添加以下内容:现在,您需要允许外部访问该站点的“引擎”级别。打开文件:#nano /var/www/nextcloud/config/config.php在Trusted_domains部分中,您需要将服务器IP地址添加到阵列中,并添加安装Nexcloud的地址。在我们的案例中,trusted_domains部分如下所示:

'memcache.local' => '\OC\Memcache\Memcached',
'memcache.distributed' => '\OC\Memcache\Memcached',
'memcached_servers' => array(
array('localhost', 11211),
),









'trusted_domains' =>
array (
0 => '127.0.0.1',
1 => '192.168.233.138',
),


现在,您可以检查服务的可服务性-打开站点并以用户user身份登录。如果授权成功,则该服务已准备就绪-您可以在计算机和智能手机上安装用于同步的应用程序,要进行访问,请输入IP地址192.168.0.3和为每个设备创建的帐户访问详细信息。
幸运的是或不幸的是,我不必充分利用创建的服务的全部潜能,因为起初我需要一个带有验证的备份系统,一开始我只是想通过颠覆来解决问题,但是提交大量小文件的速度令我非常难过。我尽了一切努力来发展,但是我并不想利用它,然后它以某种方式变得完全不能依靠云。

wtigga用户在2017年底的文章“如何下载VPS:您的Nextcloud”云中对服务的使用进行了更详细的概述从用户的角度来看,本文概述了更新的Nextcloud服务器版本12。



先进的Nextcloud微调


在工作的第一个月中,在云操作期间,出现了一些问题,我不得不在社区的帮助下或自行解决。我必须说,我非常努力地使用了该服务,实际上检查了它的抗压力能力。晚上从手机同步几GB的数据和从计算机同步多达一百万个小文件是很平常的事情。总的来说,这项服务给我留下了非常积极的印象。

我不会说以下解决方案是正确且美观的,但是这些拐杖至少适用于11.0.2版,否则将无法使用该服务。在12.x版中,可能已进行了一些改进和修复,因此,我不建议您将这些设置立即设置为启动设置的一部分,而对于11.x线,则可以立即应用。

问题1

同步过程中发生类似“文件已锁定”的错误。同步停止。这个问题是已知的-有必要通过从mysql控制台执行以下查询(授权nextcloud用户时)来清除oc_file_locks表的内容:
mysql> DELETE FROM oc_file_locks WHERE 1

由于此类错误并不罕见,因此我没有比创建脚本并将其直接放在根文件夹中更好的方法:
#nano / root / empty_oc_file_locks脚本

内容:

 #!/bin/bash mysql -unextcloud > -pnc123 -D nextcloud <<MY_QUERY DELETE FROM oc_file_locks WHERE 1 MY_QUERY 


该脚本可以手动执行,但这不是我们的方法。我决定使用cron(https://ru.wikipedia.org/wiki/Cron)每15分钟自动运行一次。
为此,请创建一个文件:
#nano / root / crontab

具有以下内容:现在,您需要更改调度程序:#crontab / root / crontab您可以检查如下更改:#crontab -l 问题2在日志中通过webDAV同步时(请参见)管理面板,由管理员授权),可能会出现以下错误:

*/15 * * * * root bash /root/empty_oc_file_locks












Error PHP reset() expects parameter 1 to be array, null given at /var/www/nextcloud/apps/files_versions/lib/Storage.php#783
Error PHP ksort() expects parameter 1 to be array, null given at /var/www/nextcloud/apps/files_versions/lib/Storage.php#782
Error PHP Invalid argument supplied for foreach() at /var/www/nextcloud/apps/files_versions/lib/Storage.php#759
Error PHP Undefined index: by_file at /var/www/nextcloud/apps/files_versions/lib/Storage.php#759
Error PHP Undefined index: all at /var/www/nextcloud/apps/files_versions/lib/Storage.php#757


这次,社区什么也没做,只能独自进行调查。原因在于错误“未定义索引... Storage.php#757”,该错误会级联多个错误。我们看一下该文件的代码。整个问题出在配额上。在代码(Storage.php#757)的这一行上,考虑到存档文件的数量,计算了可用空间。尽管配额设置为“无限制”,但计算中出了点问题。为了修复管理面板中的错误,我为每个用户设置了“无限但数字”的配额,例如100TB。

问题3

同步.htaccess文件的问题-它们根本不同步!我并不孤单,在一些论坛上他们提出了类似的问题。但是,我没有找到现成的解决方案。我不得不重新考虑一下自己。由于进行了谷歌搜索,查看日志和代码分析,所以我没有想到比如何修复nextcloud引擎文件更好的了。
在文件/var/www/nextcloud/lib/private/Files/filesystem.php中,我们查找以下行:然后将其转换为以下格式:

$blacklist = \OC::$server->getConfig()->getSystemValue('blacklisted_files', array('.htaccess'));




$blacklist = \OC::$server->getConfig()->getSystemValue('blacklisted_files', array(''));




保护Nextcloud


您可以使用fail2ban保护我们的服务,避免在管理控制台中选择密码。为此,您需要描述身份验证失败时nextcloud日志中出现的特征表达式,根据该表达式将触发相应的触发器。

创建文件:
#nano /etc/fail2ban/filter.d/nextcloud.conf

具有以下内容:

[定义]
failregex = {“” reqId“:”。*“,” RemoteAddr“:”。*“,” App“:”核心“,”消息“:”登录失败:'。*'\(远程IP:\)“,”级别“:2,”时间“:”。*“}
ignoreregex =

打开文件:#nano
/ etc /fail2ban/jail.local

在文件末尾添加以下内容:重新启动服务:#service fail2ban restart重新启动是否检查活动过滤器:

# nextcloud
[nextcloud]
enabled = true
port = http,https
protocol = tcp
filter = nextcloud
logpath = /var/log/nextcloud.log






#fail2ban-client status nextcloud

不要忘记,按照上一部分的fail2ban设置,如果连续12个小时连续六次密码输入失败,您的IP将被阻止长达30天。由于其中一部电话的密码错误,我以某种方式度过了两个晚上,直到我在系统日志中找到了这个简单的事实。



智能手机云同步


要同步运行Android的手机的内容,有一个很棒的应用程序FolderSync。该程序充分证明了其低廉的价格。

首先,您需要创建一个新帐户,在其中指定https:// 192.168.0.3/nextcloud作为服务器地址,输入先前创建的帐户的登录名和密码,并启用自签名证书。单击“测试”按钮,并确保与服务器的连接正确。

接下来,您需要创建一个任务。在任务中,指定以前创建的帐户,然后选择同步类型-“到远程文件夹”。指定远程文件夹(您可以直接从应用程序创建它,然后选择要同步的本地文件夹。我将日程表设置为每天凌晨2点。在同步设置中,我打开了“子文件夹同步”和“包含文件夹的同步”,我也选择了总是替换旧文件的选项,如果发生冲突,我默认允许使用本地文件。在“连接”部分中,我关闭了除Wi-Fi之外的所有连接,并在“允许的WiFi SSID”部分中注册了我的家庭Wi-Fi网络的SSID。芽我只能在我的家庭网络上进行同步,而不能尝试搜索其他网络上的服务器,默认情况下,我保留了其余设置。您可以在此处添加过滤。我创建了一个新的过滤器,“文件夹名称包含”,并指定了值[nosync]。因此,我可以通过简单地在名称末尾添加“ [nosync]”来将指定本地文件夹中的某些文件夹排除在同步之外。

此设置是针对DCIM,下载,电报,viber,WhatsApp等本地文件夹进行的。再加上我的几个数千兆字节的用户文件夹。每天一次,这些文件夹的内容与服务器同步,并且服务器上的文件的旧版本不会被删除,而是被重命名并移至归档中。这使我可以快速恢复意外删除的文件或回滚其他文件中的更改。



个人计算机云同步


我不认为自己是真正的程序员。在过去的十年中,我一直在使用仅用于处理器或芯片组开发的编程语言进行编程。由于我已经15年没有使用C / C ++做任何事情了,但是我需要使计算机上的某些东西自动化,所以我宁愿积极地使用脚本语言,例如BAT / CMD或软件,例如Sign 0f Mistery或xStarter。一旦发现并尝试使用AutoIt,这已成为PC自动化的新纪元。

当我确信智能手机上的同步系统的稳定性和可靠性之后,我认为在家用计算机上同步数据会很好。 Nextcloud拥有自己的Windows客户端,因此自然成为了第一个测试候选人。我打算同步一个TB级的数据量,该数据量由成千上万个大小不同的文件组成。数据是不同的:音乐,图片,文档,电子书,发行,备份站点等等。将所有这些都简化为同步更重要的数据(例如文档)是合理的,但是兴奋让我发动了,我想检查服务的强度。

同步开始十个小时后,实际上是第一次向服务器上载内容,客户端偶然发现了一个长名的文件。当时,在服务器上,我还通过VMWare共享文件夹使用了外部存储连接,我不得不尝试一打客户端,然后对手动将文件复制到服务器进行了简单的实验,以了解问题出在服务器端。因此,在成功启动该服务一周之后,我不得不回滚到备份虚拟机并放弃了VMWare Shared Folders机制,重新开始。最后,我消除了服务器端的这一瓶颈,测试了该解决方案的可靠性,以进行智能手机同步一周,然后决定再次返回我的家用计算机。这次,客户没有遇到麻烦的文件,我已经很高兴但是,在同步小文件半天后​​,客户端再次冻结。现在事实证明,家用计算机的路径太长了,Nextcloud客户端无法正确处理它。不幸的是,Nextcloud本机客户端无法正常工作,并且其信息内容不是很高,因此我不得不放弃它。

我花了一些时间试图找到一个方便的用于同步的程序,该程序支持命令行管理。我想为计算机上的每个大文件夹执行任务,并以批处理模式运行它们。之前,我已经制作并制作了一组BAT文件,以使用脚本进行同步并通过命令行管理FreeFileSync。长路径或文件名的问题通过设置格式为“ \\?\ D:\ Info”的本地文件夹解决,即实质上是将本地文件夹称为网络文件夹。但是,什么是webdav FreeFileSync不知道。不幸的是,没有适用于Windows的FolderSync的完整版本,但是在论坛上,他们推荐GoodSync不止一次,并且在投放了许多其他程序之后,我决定尝试一下。不幸的是,GoodSync贵得多,但一次性浪费15美元是为了保护自己的宝贵数据,原则上是可行的浪费。该程序具有测试模式,因此首先您可以验证其性能和稳定性。

事实证明,GoodSync是一款非常友好的软件。有一个名为GoodSync2Go的特殊便携式版本。所以她对我感兴趣。在安装过程中,您需要选择驱动器号,并在GoodSync文件夹中安装了该程序。我在驱动器的根目录中创建了Sync文件夹,比方说D,然后将创建的GoodSync文件夹及其所有内容移动到该文件夹​​中。

[ 本文是AlexanderSgeektimes.ru网站专门写的链接到源是可选的,但是非常希望获得它的引用! ]


安装后,该程序需要创建任务:指示用于同步的本地文件夹和远程文件夹。在作业参数中,我从左到右选择了同步,并选择了“同步删除”和“保存先前版本的已删除/替换的文件”。在左侧的设置中,我选择了右侧的“安全副本”和“不创建_gsdata_文件夹”-“安全副本”和“按时间戳进行快速预分析”。因此,为每个所需的文件夹创建任务。假设我在Info文件夹中配置了任务,并将其命名为“ bck_Info”。
接下来,在D:\ Sync文件夹中,使用以下内容创建bck_Info.bat文件:

 @set dir=%~dp0 @%dir%GoodSync\GoodSync2Go-v10.exe /miniwin /exit sync "%~n0" 


这是BAT脚本语言。在第一行代码中,正在运行的脚本的当前路径被设置为变量。第二行从该路径上的GoodSync文件夹启动GoodSync2Go-v10.exe文件,在该文件中,应运行具有该文件名称的任务(bck_Info),最小化任务执行窗口,并且程序应在任务完成后自动关闭。我可以多次复制此脚本,每次只将其名称更改为以前在GoodSync中创建的任务的名称。因此,只需单击BAT文件上的Enter按钮,我就可以开始分别同步所需的文件夹。

要在FreeFileSync中添加新任务,我可以复制xml脚本文件并手动更正它,即 完全不需要运行程序的图形外壳。在GoodSync中,所有任务都注册在文件D:\ Sync \ GoodSync \ GoodSync \ Profile \ jobs.tic中,要添加新任务,您将需要打开程序并创建它,因为 编辑此文件有些问题,尚不知道会导致什么。
要同步所有文件夹,您现在可以编写一个简单的bck_all.bat脚本:

 @set dir=%~dp0 call %dir%bck_Info.bat call %dir%bck_Info2.bat call %dir%bck_Info3.bat call %dir%bck_Info4.bat 

脚本的每一行仅导致执行单独的脚本,从而启动同步。

所有这些都很好且方便地工作,但是在同步期间没有错误控制。例如,如果服务器未打开,则所有任务将迅速完成,一个小时后返回的我将认为同步已完成。同时,沿着路径D创建所有任务的日志:\ Sync \ GoodSync \ GoodSync \ Profile \ *。日志。仅查看每个同步的日志中是否存在单词“ ERROR”就可以了-出于某种原因,这就是在日志中报告同步失败的方式。因此,决定编写一个用于在所有同步之后分析这些日志的小程序,该程序应在同步所有文件夹后自动启动。该程序以自豪的名称log_analayser命名,并使用半脚本语言AutoIt编写。如果有人感兴趣,请下载其完整版本您可以在AutoIt官​​方网站上,该网站包含必要的库,编译器和SciTE(跨平台编辑器),用于从中编译程序的代码。

我什么时间花在开发和调试代码上,结果是一个log_analayser.au3文件,其内容如下:

 ; LOG Analyser 1.0 ;      - #Region ;**** Directives created by AutoIt3Wrapper_GUI **** #AutoIt3Wrapper_Res_Field=ProductName|LOG Analyser #AutoIt3Wrapper_Res_Fileversion=1.0.0.0 #AutoIt3Wrapper_Res_Field=OriginalFilename|log_analyser.exe #AutoIt3Wrapper_Res_Comment=     - #AutoIt3Wrapper_Res_Description= - ;**** #AutoIt3Wrapper_Res_Language=1049 #AutoIt3Wrapper_Res_ProductVersion=1.0 #AutoIt3Wrapper_Compile_Both=y #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI **** ;AutoItSetOption ("WinTitleMatchMode", 2) ;       ;#NoTrayIcon ;         If WinExists('[CLASS:AutoIt v3;TITLE:' & @ScriptName & ']') Then MsgBox(48, @ScriptName, "     !"); ;             ;WinActivate('  ') Exit EndIf AutoItWinSetTitle(@ScriptName) #include <Array.au3> #include <_FileDirList.au3> ;  Local $msg_title = "LOG Analyser 1.0" Local $path = @ScriptDir Local $soft_open_log = "notepad.exe" Local $path, $dir_mode, $word, $file_analyse_name, $file_analyse_ext, $log_path, $log_msg_on Local $file_log, $word_detect, $file_analyse, $cnt_files, $i ;    if ($CmdLine[0] < 6) then MsgBox(0x10, $msg_title, "   !" & @CRLF & @CRLF & "  ") Exit else if (StringCompare($CmdLine[1], "file") = 0) then $dir_mode = 0 elseif (StringCompare($CmdLine[1], "dir") = 0) then $dir_mode = 1 else MsgBox(0x10, $msg_title, "     'file'  'dir'!" & @CRLF & @CRLF & "  ") Exit endif $word = $CmdLine[2] if ($dir_mode = 0) then $file_analyse_name = $CmdLine[3] else $dir_analyse = $CmdLine[3] endif $file_analyse_ext = $CmdLine[4] $log_path = $CmdLine[5] if (StringCompare($CmdLine[6], "err_msg_on") = 0) then $log_msg_on = 1 elseif (StringCompare($CmdLine[6], "err_msg_off") = 0) then $log_msg_on = 0 else MsgBox(0x10, $msg_title, "     'log_msg_on'  'log_msg_off'!" & @CRLF & @CRLF & "  ") Exit endif endIf ;   $file_log = $log_path & "\" & "log_analyser" & "-" & @YEAR & "-" & @MON & "-" & @MDAY & "-" & @HOUR & "-" & @MIN & "-" & @SEC & ".log" $word_detect = 0 ;    if ($dir_mode = 0) then $file_analyse = $file_analyse_name & "." & $file_analyse_ext if (_file_analyser($file_analyse, $msg_title, $word, $file_log, $word_detect) = 1) then $word_detect = 1 endif else ;     $dir_arr = _FileDirList($dir_analyse, "*."&$file_analyse_ext, 1, 1, 0) ;_ArrayDisplay($dir_arr) ;    -       if ($dir_arr = 0) then MsgBox(0x10, $msg_title, "       !" & @CRLF & @CRLF & "  ") Exit endif $cnt_files = $dir_arr[0] ;    $i = 0 While $i <> $cnt_files $i = $i + 1 $file_analyse = $dir_arr[$i] if (_file_analyser($file_analyse, $msg_title, $word, $file_log, $word_detect) = 1) then $word_detect = 1 endif WEnd endif ;    if ($word_detect = 1) and ($log_msg_on = 1) then if (MsgBox (0x41034, $msg_title, " !" & @CRLF & "      : " & $file_log & @CRLF & @CRLF & "   ?")) = 6 then ShellExecuteWait($soft_open_log, $file_log) endif endif Exit ;                    ;   ,   ,     Func _file_analyser($file_analyse, $msg_title, $word, $file_log, $word_detect) Local $file1, $file2, $file_line, $write_once $word_detect = 0 $write_once = 0 $file1 = FileOpen($file_analyse, 0) ;     If $file1 = -1 Then FileClose($file1) MsgBox(0x10, $msg_title, "   !" & @CRLF & @CRLF & "  ") Exit EndIf ;       While 1 $file_line = FileReadLine($file1) If @error = -1 Then ExitLoop if (StringInStr($file_line, $word) <> 0) then $word_detect = 1 ;            if (FileExists($file_log) = 0) then $file2 = FileOpen($file_log, 1) FileClose($file2) endif ;        if ($write_once = 0) then $write_once = 1 $file2 = FileOpen($file_log, 1) FileWriteLine($file2, " : " & $file_analyse) FileClose($file2) endif ;       $file2 = FileOpen($file_log, 1) FileWriteLine($file2, $file_line) FileClose($file2) endif WEnd ;     ,          if ($word_detect = 1) then $file2 = FileOpen($file_log, 1) FileWriteLine($file2, @CRLF) FileClose($file2) endif FileClose($file1) Return $word_detect EndFunc 

输入代码后,在SciTE编辑器中按F7按钮,并在输出中获取log_analayser.exe文件。

程序分析文件中是否存在单词,找到该单词时,将创建一个日志文件,将包含该单词的找到的行复制到该日志文件中。

该程序可以在两种模式下工作:

-分析特定文件
-分析包含要分析文件的文件夹(还分析所有子文件夹)

进行控制台调用时,需要为程序设置六个参数:

1-操作模式[文件=文件分析; dir =分析包含文件的文件夹]
2-搜索关键字
3-文件夹的文件名或完整路径
4-文件扩展名或文件夹中要分析的文件
5-程序日志将位于文件夹的完整路径;
6-在找到给定单词的情况下,分析所有文件后显示窗口[err_msg_on = display; err_msg_off =不显示]

因此,我们得到了一个新的bck_auto.bat脚本:

 @echo Start Backup @set dir=%~dp0 call %dir%bck_all.bat log_analyser.exe dir  %dir%GoodSync\Profile log %dir%LOG err_msg_on exit 

该脚本启动一个文件,从该文件开始依次逐个调用用于同步所有必需文件夹的任务,然后调用同步日志分析器,此后,如果出现错误,则会显示一条消息,要求您查看发现这些错误的日志行,您可以了解什么任务出现问题了。这些行将写入文件夹D:\ Sync \ LOG中的单独日志文件中。
然后我遭受了可怕的失败。日志分析器无法正常工作。不,它在测试文件上效果很好,但是固执地不想看到日志中的错误。很长一段时间,我一直不明白是什么原因,直到我发现了一件可怕的事情:不仅在英语日志中,故障仅由俄语单词“ ERROR”显示,而且该西里尔字母的编码是Macintosh!我不知道Siber Systems的程序员为什么要这样做;最有可能的原因是软件内部存在一些可怕的拐杖。好吧,谁说编程应该很无聊?

别无选择,只能用一根拐杖支撑另一根拐杖,结果出现了一种可行的结构:

 @echo Start Backup @set dir=%~dp0 call %dir%bck_all.bat log_analyser.exe dir Ћ˜€ЃЉЂ %dir%GoodSync\Profile log %dir%LOG err_msg_on exit 

但是,出现以下问题:GoodSync本身不会删除日志文件,每次执行新任务时都会出现新文件。如果某种同步失败,则我们的分析器将始终找到该文件并愉快地报告该错误。因此,在开始同步之前,决定自动从所有日志文件中清除D:\ Sync文件夹。为此,创建了一个优雅的clean_logs.bat脚本:

 @echo off set dir=%~dp0 For /R %dir% %%i in (*.log) Do ( Del /q "%%i") @echo on 

该脚本禁用任何消息的输出,查找脚本启动目录,扫描所有文件(包括子文件夹),直到它们结束,并删除所有带有日志扩展名的文件。工作结束时,消息输出将打开。
bck_auto.bat脚本已更改:

 @echo Start Backup @set dir=%~dp0 @call clean_logs.bat call %dir%bck_all.bat log_analyser.exe dir Ћ˜€ЃЉЂ %dir%GoodSync\Profile log %dir%LOG err_msg_on exit 

一切工作都很好,但重点是使常规动作自动化。为什么不只是在晚上关闭计算机并入睡,他将自己同步一堆文件,分析并关闭路径?

让我们修改bck_auto.bat脚本:

 @echo Start Backup & PCOFF @set dir=%~dp0 start MonitorOnOff.exe 0 @call clean_logs.bat call %dir%bck_all.bat log_analyser.exe dir Ћ˜€ЃЉЂ %dir%GoodSync\Profile log %dir%LOG err_msg_off shutdown /s /t 0 exit 

脚本中出现了两行。MonitorOnOff应用程序仅关闭显示器(这样它就不会照亮房间,但是每天晚上手动将其关闭,每天早晨将其打开很懒),并且shutdown命令会关闭计算机。发现错误后,负责显示消息的参数已在log_analyser中更改,因为同步后不必通过此消息来减慢脚本的执行速度,而可以使脚本关闭计算机。

MonitorOnOff也用AutoIt编写。

 ; Monitor On Off 1.0 ;   /  #Region ;**** Directives created by AutoIt3Wrapper_GUI **** #AutoIt3Wrapper_Res_Field=ProductName|Monitor On Off #AutoIt3Wrapper_Res_Fileversion=1.0.0.0 #AutoIt3Wrapper_Res_Field=OriginalFilename|MonitorOnOff.exe #AutoIt3Wrapper_Res_Comment=  /  #AutoIt3Wrapper_Res_Description=  /  ;**** #AutoIt3Wrapper_Res_Language=1049 #AutoIt3Wrapper_Res_ProductVersion=1.0 #AutoIt3Wrapper_Compile_Both=y #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI **** ;AutoItSetOption ("WinTitleMatchMode", 2) ;       ;#NoTrayIcon ;         If WinExists('[CLASS:AutoIt v3;TITLE:' & @ScriptName & ']') Then MsgBox(48, @ScriptName, "     !"); ;             ;WinActivate('  ') Exit EndIf AutoItWinSetTitle(@ScriptName) HotKeySet("{F10}", "_Monitor_ON") HotKeySet("{F11}", "_Monitor_OFF") HotKeySet("{Esc}", "_Quit") Global Const $lciWM_SYSCommand = 274 Global Const $lciSC_MonitorPower = 61808 Global Const $lciPower_Off = 2 Global Const $lciPower_On = -1 Global $MonitorIsOff = False if ($CmdLine[0] <> 0) then _Monitor_OFF() endif While 1 Sleep(10) WEnd Func _Monitor_ON() $MonitorIsOff = False Local $Progman_hwnd = WinGetHandle('[CLASS:Progman]') DllCall('user32.dll', 'int', 'SendMessage', _ 'hwnd', $Progman_hwnd, _ 'int', $lciWM_SYSCommand, _ 'int', $lciSC_MonitorPower, _ 'int', $lciPower_On) EndFunc Func _Monitor_OFF() $MonitorIsOff = True Local $Progman_hwnd = WinGetHandle('[CLASS:Progman]') While $MonitorIsOff = True DllCall('user32.dll', 'int', 'SendMessage', _ 'hwnd', $Progman_hwnd, _ 'int', $lciWM_SYSCommand, _ 'int', $lciSC_MonitorPower, _ 'int', $lciPower_Off) _IdleWaitCommit(0) Sleep(20) WEnd EndFunc Func _IdleWaitCommit($idlesec) Local $iSave, $LastInputInfo = DllStructCreate ("uint;dword") DllStructSetData ($LastInputInfo, 1, DllStructGetSize ($LastInputInfo)) DllCall ("user32.dll", "int", "GetLastInputInfo", "ptr", DllStructGetPtr ($LastInputInfo)) Do $iSave = DllStructGetData ($LastInputInfo, 2) Sleep(60) DllCall ("user32.dll", "int", "GetLastInputInfo", "ptr", DllStructGetPtr ($LastInputInfo)) Until (DllStructGetData ($LastInputInfo, 2)-$iSave) > $idlesec Or $MonitorIsOff = False Return DllStructGetData ($LastInputInfo, 2)-$iSave EndFunc Func _Quit() _Monitor_ON() Exit EndFunc 

启动的程序由三个键控制:F10打开监视器,F11-关闭,并且ESC按钮终止程序并将其从内存中卸载。如果在启动程序时指定任何参数,则正在运行的程序将立即关闭屏幕。

现在一切都很好-上床睡觉之前,我只是运行bck_all.bat,而不是“关闭计算机”然后上床睡觉。监控器无法照亮整个房间,自动执行同步并自动分析其成功。早晨,您只需要查看D:\ Sync \ GoodSync \ LOG \文件夹中的内容,至少可以找到一些文件。但是事实并非如此-如果一切都好,为什么要浪费时间呢?我需要制作一个日志分析器日志分析器日志并在系统启动时将其挂起,以便第二天在计算机启动时工作,并且只有在同步失败时才让我担心。这就是check_file_exist程序的产生方式。

 ; Check File Exist 1.0 ;        #Region ;**** Directives created by AutoIt3Wrapper_GUI **** #AutoIt3Wrapper_Res_Field=ProductName|Check File Exist #AutoIt3Wrapper_Res_Fileversion=1.0.0.0 #AutoIt3Wrapper_Res_Field=OriginalFilename|check_file_exist.exe #AutoIt3Wrapper_Res_Comment=       #AutoIt3Wrapper_Res_Description=   ;**** #AutoIt3Wrapper_Res_Language=1049 #AutoIt3Wrapper_Res_ProductVersion=1.0 #AutoIt3Wrapper_Compile_Both=y #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI **** ;AutoItSetOption ("WinTitleMatchMode", 2) ;       ;#NoTrayIcon ;         If WinExists('[CLASS:AutoIt v3;TITLE:' & @ScriptName & ']') Then MsgBox(48, @ScriptName, "     !"); ;             ;WinActivate('  ') Exit EndIf AutoItWinSetTitle(@ScriptName) #include <Array.au3> #include <_FileDirList.au3> ;  Local $msg_title = "Check File Exist 1.0" Local $path = @ScriptDir Local $soft_open_dir = "explorer.exe" Local $path, $dir_analyse, $words, $msg_open ;    if ($CmdLine[0] < 5) then MsgBox(0x10, $msg_title, "   !" & @CRLF & @CRLF & "  ") Exit else $dir_analyse = $CmdLine[1] $file = $CmdLine[2] $words0 = $CmdLine[3] $words1 = $CmdLine[4] if (StringCompare($CmdLine[5], "msg_on") = 0) then $msg_open = 1 elseif (StringCompare($CmdLine[5], "msg_off") = 0) then $msg_open = 0 else MsgBox(0x10, $msg_title, "     'msg_on'  'msg_off'!" & @CRLF & @CRLF & "  ") Exit endif endIf ;      $dir_arr = _FileDirList($dir_analyse, "*"&$file&"*", 1, 0, 0) ;_ArrayDisplay($dir_arr) ;      if ($dir_arr = 0) then if (StringCompare($words0, "0") <> 0) then if ($msg_open = 0) then MsgBox(0x41030, $msg_title, $words0) else if (MsgBox(0x41034, $msg_title, $words0 & @CRLF & @CRLF & "     ?")) = 6 then ShellExecuteWait($soft_open_dir, $dir_analyse) endif endif endif else if (StringCompare($words1, "0") <> 0) then if ($msg_open = 0) then MsgBox(0x41030, $msg_title, $words1) else if (MsgBox(0x41034, $msg_title, $words1 & @CRLF & @CRLF & "    ?")) = 6 then ShellExecuteWait($soft_open_dir, $dir_analyse) endif endif endif endif Exit 

本质上,该程序是一个略微被截断的log_analyser功能。程序分析指定文件夹(不包括子文件夹)中的文件和名称,这些文件和名称至少部分与指定搜索词匹配,并显示有关扫描结果的消息。

程序参数:

1-文件夹的完整路径(不带斜杠-/)
2-用于搜索文件名的关键字,或完整文件名
3-找不到文件时显示的文本字符串,如果= 0-不显示消息
4-文本找到文件时显示的行,如果= 0-不显示消息
5-消息输出:msg_off-仅显示有关文件存在/不存在的消息,msg_on-还建议在显示的窗口中打开检测到文件或找不到文件的文件夹。

现在,对于该程序,我创建了脚本Check_LOG_from_log_analyser.bat,将其链接放在通常的位置Windows启动:

 @set dir=%~dp0LOG start check_file_exist.exe %dir% .log 0 "     !" msg_on exit 

因此,最终我们得到了一个完全自主的解决方案,该解决方案不依赖于Sync文件夹的位置,并且可以在计算机上的任何位置正常工作。该解决方案不仅可行,而且很稳定-在Windows 7 x64上,这套脚本可以使用一年,并且绝对没有问题。

也许现在所有这些看起来都有些可怕,但是没有什么复杂的。如果仔细看一下AutoIt代码,对于任何编程语言,其基本构造都是相同类型的常规if-then-else-end循环,在该循环中将学习一些重复的AutoIt运算符和函数,而这实际上是在几个晚上学习的。由于大多数解决方案是标准的,并且早已在Internet上进行了描述,因此甚至无法教授脚本语言BAT。能够使用编程不仅有趣,而且非常有用。

颂歌《黑暗龙》中的代码




后记


老实说,我想过,但是我没想到会有如此多的文章,我不得不花费多达五十个小时。通常,将云在Internet上的安装简化为这样的说法:“是的,您需要在此处执行多个命令。”没错-安装非常简单。当您知道要输入到控制台的命令及其含义时。当您了解网络路由的本质时。当您已经拥有可以正常工作的服务器并且了解如何向其添加主机时。当您知道如何设置网站时。也就是说,要应用这几个命令,您需要具有一定的知识和经验。这三篇文章的目的是通过在一个地方收集足够的必要信息并解释如何正确使用它来创建此类行李的尝试。我真诚的希望该系列文章将帮助某人迈出有意识的第一步进入自由软件世界。



返回到目录的开头



创建家庭云的历史。第3部分。创建个人云-安装和配置Nextcloud。
文字版本:1.2.1。
首次发布日期:02/08/2018。
上次编辑时间:2020年1月15日。

更新日志
1.2.1 [15-01-2020]
.

1.2.0 [08-02-2018]
.

1.1.0 [08-02-2018]
.

1.0.0 [08-02-2018]
.
Nextcloud 11.0.2 VMWare, VMWare , Nextcloud.



有关资源管理的信息(可疑错误)
- (, code blockquote) :
[Definition]
failregex={«reqId»:".*",«remoteAddr»:".*",«app»:«core»,«message»:«Login failed: '.*' \(Remote IP: ''\)»,«level»:2,«time»:".*"}
ignoreregex =

! , .. . (/) — . :


— , « Nextcloud» , ,
— ,



Source: https://habr.com/ru/post/zh-CN410011/


All Articles