简体   繁体   中英

How do I create a file using sudo and write into it?

I created a bash script file:

#!/bin/bash
default_card=`head -1 /proc/asound/modules`
echo $default_card

if [ ! -e /etc/modprobe.d/sound.blacklist.conf ] ; then
   echo "Default sound card(snd_hda_intel) is not added in black list"
/usr/bin/expect <<delim
exp_internal 0
set timeout 20
spawn sudo sh -c "echo 'blacklist snd_hda_intel' >  /etc/modprobe.d/sound.blacklist.conf"
expect "password for ubuntu:"
send "1234\n"      
expect eof 
delim
else
   echo "Default sound cardis already added in black list";
fi

I am creating a black list file in "/etc/modprobe.d". Creating or deleting any file from "/etc" requires sudo access.

I want to implement the same functionality in Ruby using a Rake task. I created the task as:

desc "Check/creates soundcard blacklist"
task :create_blacklist do
  begin
    if !File.exists?("/etc/modprobe.d/sound.blacklist.conf")
      # code for creating new file and write into it
      ......
      ......
    else
      puts "Sound-card blacklist file is present at /etc/modprobe.d/sound.blacklist.conf"
    end
  rescue Exception => e
    puts "problem creating file #{e.message}"
  end
end

I don't know how to create new file using sudo, and write into it.

I am using Ruby 1.9.3 (without RVM).

Look at https://stackoverflow.com/a/18366155/128421 , https://stackoverflow.com/a/18398804/128421 , and " communicating w/ command-line program (OR ruby expect) " for more information.

Ruby's IO class implements expect but it's not too full-featured:

=== Implementation from IO
------------------------------------------------------------------------------
  IO#expect(pattern,timeout=9999999)                  ->  Array
  IO#expect(pattern,timeout=9999999) { |result| ... } ->  nil

------------------------------------------------------------------------------

Reads from the IO until the given pattern matches or the timeout is over.

It returns an array with the read buffer, followed by the matches. If a block
is given, the result is yielded to the block and returns nil.

When called without a block, it waits until the input that matches the given
pattern is obtained from the IO or the time specified as the timeout passes.
An array is returned when the pattern is obtained from the IO. The first
element of the array is the entire string obtained from the IO until the
pattern matches, followed by elements indicating which the pattern which
matched to the anchor in the regular expression.

The optional timeout parameter defines, in seconds, the total time to wait for
the pattern.  If the timeout expires or eof is found, nil is returned or
yielded.  However, the buffer in a timeout session is kept for the next expect
call.  The default timeout is 9999999 seconds.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM