本文介绍Webmin的Custom Command模块,它可以用于创建按钮来运行经常使用的shell命令。
大多数系统管理员喜欢创建shell脚本来执行常见任务,如备份数据库或者添加一个某类新用户。因为每个系统和组织不同,将总有像Webmin的通用工具不能容易像一个简单自定义脚本做的任务。在命令行中运行的脚本对一个没有经验用户要使用不容易。
自定义命令模块允许你为shell脚本和命令创建一个简单的web接口,因而从Webmin内能够用一个按钮的点击运行它们。它也允许你为每个命令定义各种类型参数,这些参数可以由用户输入并且被替换到shell命令。取决于在运行它前用户做的选择,这可以用于提供参数或输入给要被运行的脚本。
这个模块的另一个特性是能够定义文件编辑器,因而能够通过Webmin的web接口编辑经常被更改的文件。你也可以定义在文件被编辑前后要被运行的命令,因而可以在编辑前验证,复制或者备份它。
这个模块可能最有用的特性是其访问控制支持。你可以授权其它webmin用户使用某些或所有命令和编辑器,而只给自己和其它受信管理员创建和编辑命令命令的权限。这意味着其它用户只能执行你允许它们执行的脚本和编辑你允许它们编辑的文件,但不带完全的root特权。
不同于大部分其它模块,这个模块不处理某个单独的服务器或服务的配置。因而它在所有Webmin能够所运行的Unix版本上有完全相同的用户接口和功能。
当你从Tools类别进入这个模块时,它的主页显示所有已有自定义命令和文件编辑器以及它们的参数。如果你之前没有使用这个模块,这页将是空的。

你可以通过点击在这个主页上显示的命令的按钮运行这个命令。但如果这个命令有参数字段或者选项,在运行它前,你必须填入它们或者进行合适的选择。当按下这个按钮时,将向你显示一个页面,其显示来自这个命令的输出,因而你可以看到它成功或失败。
要使用一个文件编辑器,只要在这个主页上点击它的按钮。这向你显示一个显示当前文件内容的编辑表单,你可以自由地修改图它。当结束时,点击这个文本框下面的save按钮来写出此新文件内容。
要创建一个能够被这个模块主页上一个按钮运行的新命令,按照这些步骤:
1) 点击已有按钮上或下的*Create a new custom command*链接。这将产生一个以下图片中显示的创建表单。

2) 在Description字段中为你的命令输入一个简短描述。你输入的任何文本将显示在这个主页上命令的按钮上。你也可以输入更多文本(包括HTML标签)到它之下的更大文本框,被显示在这个按钮下面。
3) 在Command字段中,输入你想要执行的shell脚本或者命令。所有标准元字符{| border="1" |-都被支持,诸如||, &, <和>。要输入多个命令,|} 用;或&&分开它们。如果你的命令有参数(在第10步设置),当运行这个命令时,它们将被转换成环境变量。所以,如果你有一个名为foo的参数,在命令字符串中所有出现$foo的地方将被用户为那个参数输入的东西替代。例如,一条允许用户finger系统上任何用户的命令看起来像$user。
4) 默认,命令将在将在对应这个模块的Webmin目录中运行。要更改这个,取消选择对应Run in directory字段的Default并且输入一个不同路径到它旁边的文本框中。
5) 在Run as user字段中,输入以哪个用户运行这个命令的Unix用户名。你可以选择Webmin用户来替代,这将使得它以运行它的Webmin用户有相同名称的Unix用户来运行。当执行这个命令时,如果他通过telnet或SSH登录,这个命令通常不能访问这个Unix用户有的相同环境变量。但如果你勾选了Use user's environment选项,则在这个用户的.profile, .cshrc和其它登录文件中设置的所有变量将可用。Webmin用su运行这个命令,这切换到这个用户,执行它的shell并且执行这条命令。
6) 如果当你的命令被运行时,它产生了你想要在浏览器中显示的HTML输出,更改*Command outputs HTML?*字段为Yes。否则Webmin将转义输出中所有HTML标签,这对于只产生普通文本的命令是要做的正确事情。
7)要控制在这个模块首页上新命令的位置,为Ordering on main page选项输入一个数值。命令被排序,使得最大数值首先出现。如果选择了Default,取排序号为0。如果你未为任何你自定义命令设置排序号,将按它们被创建的顺序显示它们。
8) 要防止用户在点击按钮时看到正在被运行的实际shell命令,设置*Hide command when execting*字段Yes。如果你的命令包含你想要对用户隐藏的密码或者其它敏感信息,这是一个好办法。
9) 要使得这个命令在Usermin的自定义命令模块中显示,更改Available in Usermin?字段为Yes。
10)如果你想要你的命令具有用户能够在这个主页上设置的参数,你需要填入Command parameters部分。在这部分中表格中每行定义一个参数,为每行必须输入以下信息。
11) 最终,当你完成输入你新命令的详情时,点击Create按钮。只要在表单中没有错误,你将返回这个模块的主页,新命令按钮将在这个主页上可见。

点击以上的ooutallfiles按钮,将会显示以下输出:
一旦创建了一个命令,你可以通过点击这个模块主页上与创建命令按钮同一行最右侧的Edit Command链接,编辑它。以上描述的所有字段可以被更改,并且能够添加其它参数。当你完成更改后,点击这页底部的Save按钮。或者呀删除一个命令,点击右下角的Delete按钮。
参数类型:对于在一条命令中每个参数,你可以从Type列下菜单选择一个类型。可用选项和它们的含义是:
要添加一个新按钮到这个模块主页用于编辑一个文件,你必须按照这些步骤:
1) 点击已有按钮上或下的Create a new file editor链接。这将产生在以下窗口中显示的编辑器创建表格。

2) 在Description字段中输入一个用于待被编辑文件的简单描述。你输入的任何文本将在这个主页上编辑器按钮上显示。你也可以输入其它文本(包括HTML标签)到其下更大的文本框,在这个按钮下显示。
3) 向*File to edit*字段输入待被编辑文件的完整路径。这个文件不是必须存在。
4) 当保存它时,要更改这个文件的所有者,设置*File ownership*字段为User并且输入一个Unix用户名和组名到它旁边的字段。当编辑一个还不存在的文件时,这尤其有用,因而合适地设置了新创建文件地所有者。如果你保留这个字段设定为Leave as it,当保存它时将不更改文件的所有者。新创建的文件将由root所有。
5)要在保存文件时更改它的访问权限,设置File Permission字段为Set to octal并且输入权限(如700或664)到它旁边的字段。要对,选择Leave as it,在保存它时将不更改这个文件的权限。新创建文件的权限取决于Webmin进程的掩码。
6) 要只在用户保存文件前运行一条命令,填入*Command to run before saving*字段。这对产生一个备份,从RCS中检查出文件或者你会遇到的其它任何事情有用。
7) 类似的,要在这个文件保存后运行一条命令,填入*Command to run after saving*字段。对于验证文件内容有效性,复制它到另一个系统有用。
8) 要控制在模块首页上新编辑按钮的位置,为*Ordering on main page*输入一个数值。命令和编辑器都被排序,使得有最大数值的那些首先显示。如果选择Default,取排序号为0。如果你没有为你任何文件编辑器设置排序号,按创建它们的顺序显示它们。
9) 要使编辑器在Usermin的自定义命令模块中显示,更改Available in Usermin?字段为Yes。
10) 最后,点击Save按钮。如果在表单中没有错误,你将返回到这个模块的主页,它将包括对应这个新编辑器的按钮。

一旦创建了一个编辑器,你可以通过点击这个模块主页上*Edit file editor*链接编辑它。一旦你完成了修改,点击本页底部的Save按钮。或者要删除这个编辑器,点击右下角的Delete按钮。
点击产生的编辑按钮后,显示一个文本编辑器:

在Custom Commands模块中的访问控制选项被设计成允许一个主Webmin用户赋给一些其它用户允许所选命令的权限,但不能编辑或者创建它们。从安全视角,赋给一个不受信任用户创建它自己自定义命令的权限是没有意义的,因为那将使他能够以root运行任何命令,并且因而破坏了整个系统的安全。一旦你创建了能够访问Custom Commands模块的用户或组,按照这些步骤限制他的访问:
1) 在Webmin Users模块中,点击你想要授权给的用户或组的名称下Available Webmin模块下tools类别下Custom Commands模块。
2) 更改*Can edit module configuration?*字段为No。
3) 除非你想要这个用户能够运行所有命令和使用所有编辑器,否则设置*Commands this user can run *为Selected,并且从下面列表选择允许他使用的那些命令或编辑器。另外,你可以选择*
All except selected.. *并且从列表中选择不允许他使用的命令。所有其它命令对他可用。
4) 更改*Can create and edit commands?*字段为No。
5) 点击Save按钮。访问控制设置将被激活并且你将返回到Webmin Users模块的主页。
如果你想要授权所选的自定义命令和编辑器到非常多的用户,一个更好的方法是安装Usermin,它允许任何Unix user登录。Available in Usermin?字段设为Yes的任何命令将在Usermin的自定义命令模块中可见,并且用完全相同方式运行。有关Usermin和如何配置它来限制哪些Unix用户可以运行自定义命令的更多信息见Usermin Configuration。