使用sudo,在Scala中使用sys.process将多行写入文件
我正在尝试设置我的ip地址,如前一篇文章所述。然而,我发现最好的候选方法(尽管它还不起作用)似乎是将无密码的使用sudo,在Scala中使用sys.process将多行写入文件,scala,Scala,我正在尝试设置我的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 st
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:语法错误:未终止的引号字符串
忽略未知接口eth0=eth0。
vala=…
,valb=…
,等等,才能使代码正确解析。不过,我确实希望适当地处理这些命令中的任何错误#>
,这要求右侧是文件,在这种情况下,需要sudo
才能写入。有解决办法吗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=…
,因为后缀运算符与之间存在歧义代码>您可以避免这种情况。我们还需要给出
aSeq[String]
而不是String
。使用字符串
,Scala将以空格分隔命令及其参数,这在本例中不符合我们的要求,例如sh-c'echo x'
将变成Seq(“sh”、“-c”、“echo”、“x”
,而不是Seq(“sh”、“-c”、“echo x”)
。运行此代码时出现以下错误:rm:1:rm:Syntax error:Unterminated quoted string
@jonderry发现您需要使用Seq
,请参阅我的新编辑。