使用sudo,使用Scala中的sys.process将多行写入文件

时间:2014-06-04 22:57:36

标签: scala

我正在尝试设置我之前question中所述的IP地址。但是,最好的候选方法(即使它还没有工作)我发现似乎是使用无密码sudosys.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" !

这有一些问题:

  1. 我收到以下错误,其中显示语法错误和无法成功编写描述eth0的文件(*.cfg来自/etc/network/interface):

    -e: 1: -e: Syntax error: Unterminated quoted string Ignoring unknown interface eth0=eth0.

  2. 我必须插入val a = ...val b = ...等,才能正确解析代码。我确实希望适当地处理这些命令中的错误。

  3. 看来文件io通常使用#>,它要求右侧是一个文件,在这种情况下需要sudo才能写入。有解决方案吗?

  4. 我怎样才能以最好和最恰当的方式正确地做到这一点?

1 个答案:

答案 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")