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

使用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

我正在尝试设置我的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:语法错误:未终止的引号字符串
    忽略未知接口eth0=eth0。

  • 我必须插入
    vala=…
    valb=…
    ,等等,才能使代码正确解析。不过,我确实希望适当地处理这些命令中的任何错误

  • 似乎文件io通常使用
    #>
    ,这要求右侧是文件,在这种情况下,需要
    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=…
    ,因为后缀运算符与
    之间存在歧义您可以避免这种情况。我们还需要给出
    a
    Seq[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
    ,请参阅我的新编辑。