在不久前的某个时候,科幻迷们开始了一年一度的 星球大战 5 月 4 日 庆祝活动,这是对绝地祝福“愿原力与你同在”的双关语。虽然大多数 Linux 用户可能不是绝地武士,但他们仍然有使用原力的方法。当然,如果尤达只是简单地告诉卢克输入 man X 翼战斗机 或 man force,或者如果他说“RTFM”(当然是阅读原力手册),这部电影可能就不会那么令人兴奋了。
许多 Linux 命令都有 -f 选项,顾名思义,它代表 force(强制)!有时,当您执行命令时,它会失败或提示您输入其他内容。这可能是为了保护您尝试更改的文件,或告知用户设备正忙或文件已存在。
如果您不想被提示打扰,或者不关心错误,请使用原力!
请注意,使用命令的 force 选项来覆盖这些保护通常是具有破坏性的。因此,用户需要密切注意并确保他们知道自己在做什么。使用原力可能会产生后果!
以下是四个带有 force 选项的 Linux 命令,以及关于如何以及为何您可能想要使用它的简要说明。
cp
cp 命令是 copy(复制)的缩写——它用于复制(或克隆)文件或目录。手册页 将 cp 的 force 选项描述为
-f, --force
if an existing destination file cannot be opened, remove it
and try again
此示例适用于您处理只读文件的情况
[alan@workstation ~]$ ls -l
total 8
-rw-rw---- 1 alan alan 13 May 1 12:24 Hoth
-r--r----- 1 alan alan 14 May 1 12:23 Naboo
[alan@workstation ~]$ cat Hoth Naboo
Icy Planet
Green Planet
如果您想将名为 Hoth 的文件复制到 Naboo,cp 命令将不允许这样做,因为 Naboo 是只读的
[alan@workstation ~]$ cp Hoth Naboo
cp: cannot create regular file 'Naboo': Permission denied
但是通过使用原力,cp 将不会提示。Hoth 的内容和权限将立即复制到 Naboo
[alan@workstation ~]$ cp -f Hoth Naboo
[alan@workstation ~]$ cat Hoth Naboo
Icy Planet
Icy Planet
[alan@workstation ~]$ ls -l
total 8
-rw-rw---- 1 alan alan 12 May 1 12:32 Hoth
-rw-rw---- 1 alan alan 12 May 1 12:38 Naboo
哦不!我希望他们在纳布有冬季装备。
ln
ln 命令用于在文件之间创建链接。 手册页 将 ln 的 force 选项描述为
-f, --force
remove existing destination files
假设莱娅公主正在维护一个 Java 应用程序服务器,并且她有一个目录来存储所有 Java 版本。这是一个例子
leia@workstation:/usr/lib/java$ ls -lt
total 28
lrwxrwxrwx 1 leia leia 12 Mar 5 2018 jdk -> jdk1.8.0_162
drwxr-xr-x 8 leia leia 4096 Mar 5 2018 jdk1.8.0_162
drwxr-xr-x 8 leia leia 4096 Aug 28 2017 jdk1.8.0_144
如您所见,有多个版本的 Java 开发工具包 (JDK) 和一个指向最新版本的符号链接。她使用以下命令的脚本来安装新的 JDK 版本。但是,如果没有 force 选项,或者除非 root 用户运行它,否则它将无法工作
tar xvzmf jdk1.8.0_181.tar.gz -C jdk1.8.0_181/
ln -vs jdk1.8.0_181 jdk
tar 命令会将 .gz 文件提取到指定目录,但 ln 命令将无法升级链接,因为链接已存在。结果将是该链接不再指向最新的 JDK
leia@workstation:/usr/lib/java$ ln -vs jdk1.8.0_181 jdk
ln: failed to create symbolic link 'jdk/jdk1.8.0_181': File exists
leia@workstation:/usr/lib/java$ ls -lt
total 28
drwxr-x--- 2 leia leia 4096 May 1 15:44 jdk1.8.0_181
lrwxrwxrwx 1 leia leia 12 Mar 5 2018 jdk -> jdk1.8.0_162
drwxr-xr-x 8 leia leia 4096 Mar 5 2018 jdk1.8.0_162
drwxr-xr-x 8 leia leia 4096 Aug 28 2017 jdk1.8.0_144
她可以通过传递 force 选项和另一个选项 -n 来强制 ln 正确更新链接。需要 -n 是因为该链接指向一个目录。现在,该链接再次指向最新的 JDK
leia@workstation:/usr/lib/java$ ln -vsnf jdk1.8.0_181 jdk
'jdk' -> 'jdk1.8.0_181'
leia@workstation:/usr/lib/java$ ls -lt
total 28
lrwxrwxrwx 1 leia leia 12 May 1 16:13 jdk -> jdk1.8.0_181
drwxr-x--- 2 leia leia 4096 May 1 15:44 jdk1.8.0_181
drwxr-xr-x 8 leia leia 4096 Mar 5 2018 jdk1.8.0_162
drwxr-xr-x 8 leia leia 4096 Aug 28 2017 jdk1.8.0_144
可以将 Java 应用程序配置为使用路径 /usr/lib/java/jdk 查找 JDK,而无需每次 Java 更新时都更改它。
rm
rm 命令是 “remove”(删除)的缩写(我们通常称之为删除,因为某些其他操作系统为此操作有一个 del 命令)。 手册页 将 rm 的 force 选项描述为
-f, --force
ignore nonexistent files and arguments, never prompt
如果您尝试删除只读文件,rm 将提示您
[alan@workstation ~]$ ls -l
total 4
-r--r----- 1 alan alan 16 May 1 11:38 B-wing
[alan@workstation ~]$ rm B-wing
rm: remove write-protected regular file 'B-wing'?
您必须键入 y 或 n 来回答提示,并允许 rm 命令继续执行。如果您使用 force 选项,rm 将不会提示您,并将立即删除该文件
[alan@workstation ~]$ rm -f B-wing
[alan@workstation ~]$ ls -l
total 0
[alan@workstation ~]$
force 与 rm 最常见的用途是删除目录。 -r (recursive,递归) 选项告诉 rm 删除目录。当与 force 选项结合使用时,它将删除目录及其所有内容,而无需提示。
带有某些选项的 rm 命令可能是灾难性的。多年来,在线论坛上充斥着用户完全擦除其系统的笑话和恐怖故事。这种臭名昭著的用法是 rm -rf *。这将立即删除所有文件和目录,而无需在任何使用它的地方进行任何提示。
userdel
userdel 命令是 user delete(用户删除)的缩写,它将删除用户。手册页 将 userdel 的 force 选项描述为
-f, --force
This option forces the removal of the user account, even if the
user is still logged in. It also forces userdel to remove the
user's home directory and mail spool, even if another user uses
the same home directory or if the mail spool is not owned by the
specified user. If USERGROUPS_ENAB is defined to yes in
/etc/login.defs and if a group exists with the same name as the
deleted user, then this group will be removed, even if it is
still the primary group of another user.
Note: This option is dangerous and may leave your system in an
inconsistent state.
当欧比旺到达穆斯塔法星球上的城堡时,他知道必须要做什么。他必须删除达斯的帐户——但达斯仍然登录着。
[root@workstation ~]# ps -fu darth
UID PID PPID C STIME TTY TIME CMD
darth 7663 7655 0 13:28 pts/3 00:00:00 -bash
[root@workstation ~]# userdel darth
userdel: user darth is currently used by process 7663
由于达斯当前已登录,欧比旺必须使用 userdel 的 force 选项。即使帐户已登录,这也会删除用户帐户。
[root@workstation ~]# userdel -f darth
userdel: user darth is currently used by process 7663
[root@workstation ~]# finger darth
finger: darth: no such user.
[root@workstation ~]# ps -fu darth
error: user name does not exist
正如您所见,finger 和 ps 命令确认用户达斯已被删除。
在 shell 脚本中使用 force
许多其他命令都有 force 选项。force 非常有用的一个地方是在 shell 脚本中。由于我们在 cron 作业和其他自动化操作中使用脚本,因此避免任何提示至关重要,否则这些自动化流程将无法完成。
我希望我上面分享的四个示例可以帮助您理解某些情况下可能需要使用 force。当在命令行或创建自动化脚本中使用 force 选项时,您应该对其有深刻的理解。它的误用可能会产生灾难性的影响——有时会跨越您的基础设施,而不仅仅是在单台机器上。
4 条评论