我正在尝试设置我之前question中所述的IP地址。但是,最好的候选方法(即使它还没有工作)我发现似乎是使用无密码sudo
和sys.process
包,因为我需要sudo
个权限来执行必要的行动如下:
import sys.process._
val a = "sudo rm -f /etc/network/interfaces.d/eth0.cfg" !
val b = s"""sudo sh -c 'echo -e
auto eth0
iface eth0 inet static
address $ip
netmask 255.255.255.0
gateway 192.168.2.1
dns-nameservers 8.8.8.8
> /etc/network/interfaces.d/eth0.cfg'""" !
val c = "sudo /sbin/ifup eth0" !
这有一些问题:
我收到以下错误,其中显示语法错误和无法成功编写描述eth0
的文件(*.cfg
来自/etc/network/interface
):
-e: 1: -e: Syntax error: Unterminated quoted string
Ignoring unknown interface eth0=eth0.
我必须插入val a = ...
,val b = ...
等,才能正确解析代码。我确实希望适当地处理这些命令中的错误。
看来文件io通常使用#>
,它要求右侧是一个文件,在这种情况下需要sudo
才能写入。有解决方案吗?
我怎样才能以最好和最恰当的方式正确地做到这一点?
答案 0 :(得分:2)
执行:
Seq("sudo", "sh", "-c", s"""
rm -f /etc/network/interfaces.d/eth0.cfg
echo -n "auto eth0
iface eth0 inet static
address $ip
netmask 255.255.255.0
gateway 192.168.2.1
dns-nameservers 8.8.8.8
" > /etc/network/interfaces.d/eth0.cfg
/sbin/ifup eth0
""").!
不需要多次调用sudo
,而是调用它一次并让它在shell中运行多个命令。 echo
需要在引号内引用其他参数,否则sh
会将换行符解释为echo
命令的结尾。您需要val a = ...
,因为后缀运算符不明确,.!
可以避免这种情况。我们还需要!
一个Seq[String]
而不是String
。使用String
,Scala将在空格上拆分以分离命令及其参数,在这种情况下,它不会执行我们想要的操作,例如: sh -c 'echo x'
将变为Seq("sh", "-c", "'echo", "x'")
而不是Seq("sh", "-c", "echo x")
。