Bug 503134

Summary: guestfish's list splitting does not recognize internal quoting
Product: [Community] Virtualization Tools Reporter: Charles Duffy <charles_duffy>
Component: libguestfsAssignee: Richard W.M. Jones <rjones>
Status: ASSIGNED --- QA Contact:
Severity: low Docs Contact:
Priority: low    
Version: unspecifiedCC: rjones, virt-maint
Target Milestone: ---   
Target Release: ---   
Hardware: All   
OS: Linux   
Whiteboard:
Fixed In Version: Doc Type: Bug Fix
Doc Text:
Story Points: ---
Clone Of: Environment:
Last Closed: Type: ---
Regression: --- Mount Type: ---
Documentation: --- CRM:
Verified Versions: Category: ---
oVirt Team: --- RHEL 7.3 requirements from Atomic Host:
Cloudforms Team: --- Target Upstream Version:
Embargoed:

Description Charles Duffy 2009-05-29 06:56:28 UTC
Richard W.M. Jones wrote:
> On Thu, May 28, 2009 at 05:41:44PM -0500, Charles Duffy wrote:
>> What's the Right Way to do the below?
>>
>>> <fs> command "bash -c 'for D in avahi-daemon avahi-dnsconfd haldaemon;  
>> do /sbin/chkconfig $D off; done; true'"
>> libguestfs: error: D: -c: line 0: unexpected EOF while looking for  
>> matching `''
>> D: -c: line 1: syntax error: unexpected end of file
>
> The problem is that guestfish's list splitting code sucks, so
> the above turns into the equivalent of this API call:
>
> guestfs_command (g, "bash", "-c", "'for", "D", "in",
> 		"avahi-daemon", "avahi-dnsconfd", "haldaemon;",
> 		"do", "/sbin/chkconfig", "$D", "off;", "done;", "true'");
>
> Please file a bug about this.

Behavior should be closer to that of the actual shell, or python's "shlex", preserving quoted strings as individual tokens. (Alternately, system() could be used in place of an exec call, such that the tokenizing is done by an _actual_ shell within the guest).

Comment 1 Richard W.M. Jones 2009-05-29 10:28:30 UTC
The syntax I was thinking of using was:

["foo", "bar"]

guestfish doesn't include a real scanner, instead it
splits on whitespace.  However it checks the first character
of each argument and modifies its behaviour accordingly.
For example, if the first character is ' or " then instead
of blindly splitting, it searchs for the corresponding close-quote.

So with the syntax above, if the first character after whitespace
was an opening [ then we would parse the rest as comma-separated
strings until a matching ] was found.

(The alternative would be to use lex and write a real scanner,
but we'd need to be careful not to break existing scripts).

Comment 2 Richard W.M. Jones 2009-06-22 06:51:32 UTC
This cset adds support for 'sh' and 'sh-lines' commands
which should alleviate this problem.

http://git.et.redhat.com/?p=libguestfs.git;a=commitdiff;h=57d2dfab18ad3d987d9273bb7c1f42e73e0bbcb2

Example usage:

 ><fs> sh "echo /s*"
 /sbin /selinux /srv /sys
 
 ><fs> sh-lines "ls -1d /s*"
 /sbin
 /selinux
 /srv
 /sys