我想让我的remotelogin始终保持" On"。在这种情况下,调用.plist并运行shell脚本(上面的那个)以查看RemoteLogin是否为Off,如果是,则运行以下两个命令;否则,退出0。
我有什么东西在这里失踪吗?也许"关"需要替换为0?
if [ `sudo systemsetup -getremotelogin` = "Off" ]; then
sudo systemsetup -setremotelogin on
sudo launchctl load -w /System/Library/LaunchDaemons/ssh.plist
else
exit 0
fi
答案 0 :(得分:3)
您应该测试"Remote Login: Off"
而不是"Off"
。
当我执行该命令时,我得到以下内容:
Blackintosh:~ jhr$ sudo systemsetup -getremotelogin
Remote Login: Off
使用:
Blackintosh:~ jhr$ sw_vers
ProductName: Mac OS X
ProductVersion: 10.10.5
BuildVersion: 14F27
这更像是你想要的样子:
#!/usr/bin/env bash
if [ "`sudo systemsetup -getremotelogin`" = "Remote Login: Off" ]; then
sudo systemsetup -setremotelogin on
sudo launchctl load -w /System/Library/LaunchDaemons/ssh.plist > /dev/null 2>&1
sudo systemsetup -getremotelogin
fi
我通常将命令执行分配给变量,就像您为函数调用和可维护性所做的那样。您通常最终需要在非平凡的脚本中输出多个位置。
remoteLoginState=`sudo systemsetup -getremotelogin`
if [ "$remoteLoginState" = "Remote Login: Off" ]; then
...
fi
并确保在脚本上设置可执行标志。
答案 1 :(得分:3)
补充Jarrod Roberson's helpful answer:
问题是你使用POSIX风格的条件[ ... ]
,没有引用 LHS :
使用命令语法解析此类条件,这意味着 `sudo systemsetup -getremotelogin`
的结果 - 由于未加引号 - 受到分词和路径名扩展的影响< /强>:
sudo systemsetup -getremotelogin
产生文字字符串Remote Login: Off
,应用了分词(和路径名扩展,这里恰好是无操作),然后shell执行[
好像已经指定了以下内容:
[ 'Remote' 'Login:' 'Off' = 'Off' ]
正如您所看到的,现在有 3 LHS参数而不是 1 ,这违反了[
shell内置的语法并导致{你看到{1}}错误。
一个可能的解决方法是双引号命令替换并修复RHS以匹配命令替换输出的整个字符串,如Jarrod的答案。
如果您正在尝试编写符合POSIX标准的便携式脚本,那么就可以了。
相比之下,如果您专门定位[: too many arguments
,那么有更好的选项可以提供更大的灵活性:
bash
OR:
if [[ $(sudo systemsetup -getremotelogin) =~ 'Off' ]]; then
请注意命令替换if [[ $(sudo systemsetup -getremotelogin) == *'Off'* ]]; then
(这是$(...)
的优越替代品)现在不需要引用,因为`...`
的{ {1}}构造从bash
解析 ;但是,为了保持一致,你可能仍然是双引号。
[[ ... ]]
将扩展正则表达式匹配应用于RHS的未加引号部分;使用[ ... ]
作为RHS - 引用字符串 - 这有效地提供了子字符串匹配。
=~
将glob样式模式匹配应用于RHS的未加引号部分,并匹配整个 LHS;因此'Off'
也有效地提供了子串匹配。