It seems after testing that the solution I discovered last night
(described in the first post, edit command.rb so it won't escape
backticks) is a correct and robust solution.

* The quoted command is run on the remote host.

* It works when remote user's default shell is tcsh.

* It works when remote user's default shell is bash.

* It works when default_run_options[:shell]=false (though it will then
run tcsh if that's your default shell)

* It works when default_run_options[:shell] is not set.

* 'rake test' reports all tests passing.

I pushed the change to github scottj97/capistrano.


On 19 May, 13:30, Jamis Buck <[email protected]> wrote:
> It's only possible if you are using an interactive (e.g., login) shell
> with SSH, and Capistrano is not. Believe me, I've explored and explored
> this, trying to find ways to make Capistrano friendly to non-posix
> shells, and "sh -c ..." is the closest I got.
>
> - Jamis
>
> On 5/19/09 2:25 PM, Scott Johnson wrote:
>
> > I guess I'm getting way beyond my expertise here, but is it possible
> > to specify a shell when you SSH? Instead of taking the default shell?
>
> > I tried default_run_options[:shell]=false in my real capfile, but of
> > course that led to shell syntax errors in the builtin Rails recipes
> > (specifically deploy:rollback) because it's using tcsh, not sh
> > anymore.
>
> > On 19 May, 12:15, Jamis Buck<[email protected]>  wrote:
> >> I'll bet it's tcsh. Capistrano calls "sh -c ..." specifically to work
> >> around issues with non-posix shells; it sure sucks when those non-posix
> >> shells make it impossible to make posix calls.
>
> >> I'm afraid it's looking like your only option is going to be to change
> >> your default shell to something posix. :(
>
> >> - Jamis
>
> >> On 5/19/09 12:47 PM, Scott Johnson wrote:
>
> >>> Adding :shell =>    false to the run params does work. But I would still
> >>> like to resolve this. I'm probably not the last person that will
> >>> encounter this problem with Capistrano, and while it's evidently not
> >>> the tool's fault, if there's something Cap can do to avoid it, that
> >>> would be nice.
> >>> I think it's clearly something with my environment. I tried the sh -c
> >>> command on all the bash versions I could find, all using the same
> >>> environment, and they all failed.
> >>> 3.1.17(1)-release (i686-redhat-linux-gnu)
> >>> 3.1.7(1)-release (x86_64-redhat-linux-gnu)
> >>> 2.0.5a.0(1)-release (i686-pc-linux-gnu)
> >>> 3.00.15(1)-release (i686-redhat-linux-gnu)
> >>> But when I ran at home (WinXP, msysGit bash, with the default msysGit
> >>> environment), it worked fine.
> >>> One difference is the shell I'm launching from: tcsh (my default shell
> >>> on those systems) in all the broken cases. When I launch sh -c from
> >>> bash itself, it works. Perhaps tcsh is mangling the command before
> >>> invoking sh? Here's a clue:
> >>> % echo "foo is \`date\`"
> >>> foo is \
> >>> I don't understand that.
> >>> On 19 May, 10:39, Jamis Buck<[email protected]>    wrote:
> >>>> Maybe it's something with that version of GNU bash? This one works for 
> >>>> me:
> >>>> $ sh --version
> >>>> sh --version
> >>>> GNU bash, version 3.2.17(1)-release (i386-apple-darwin9.0)
> >>>> Copyright (C) 2005 Free Software Foundation, Inc.
> >>>> It also works fine with the posix shell in Ubuntu (not sure which
> >>>> version of Ubuntu, but fairly recent).
> >>>> Also, I think I led you astray with the set(:shell, false) nonsense. The
> >>>> correct way to set that is either this:
> >>>>      run("echo today is `date`", :shell =>    false)
> >>>> or
> >>>>      default_run_options[:shell] = false
> >>>> The former only applies to that run invocation; the latter applies
> >>>> globally to all run invocations.
> >>>> - Jamis
> >>>> On 5/19/09 11:32 AM, Scott Johnson wrote:
> >>>>> Getting closer! Something is wacked with my shell:
> >>>>> % sh -c "echo today is \`date\`"
> >>>>> today is
> >>>>> % sh --version
> >>>>> GNU bash, version 3.1.17(1)-release (i686-redhat-linux-gnu)
> >>>>> Copyright (C) 2005 Free Software Foundation, Inc.
> >>>>> Perhaps I have some environment variable set wrong or something?
> >>>>> Jamis, the capfile I posted in my original message is the complete
> >>>>> capfile. I tried adding set :shell, false and it made no difference.
> >>>>> I suppose the change I made to command.rb is incorrect because the
> >>>>> backticked command will be run locally instead of remotely. (Right?)
> >>>>> On 19 May, 09:47, Jamis Buck<[email protected]>      wrote:
> >>>>>> The reason it is escaped is because Capistrano invokes the command via
> >>>>>> 'sh' (by default). E.g., the following run command:
> >>>>>>       run "echo today is `date`"
> >>>>>> Gets translated into the following shell command:
> >>>>>>       sh -c "echo today is \`date\`"
> >>>>>> The backticks need to be escaped so that they get evaluated by the 
> >>>>>> inner
> >>>>>> shell, and not the outer shell.
> >>>>>> That said, what does the rest of your capfile look like? Are you 
> >>>>>> setting
> >>>>>> :shell anywhere? What version of the posix shell do you have on your
> >>>>>> remote host?
> >>>>>> You might also try setting :shell to false, so that all commands are
> >>>>>> invoked directly:
> >>>>>>       set :shell, false
> >>>>>> That way, commands will be run without wrapping them in a "sh -c ..." 
> >>>>>> call.
> >>>>>> - Jamis
> >>>>>> On 5/19/09 10:33 AM, Scott Johnson wrote:
> >>>>>>> I don't believe it is a permissions thing. I can run the same command
> >>>>>>> not in backticks and it works. I can run the backticked command
> >>>>>>> directly (not through Capistrano) and it works as expected:
> >>>>>>> date is Tue May 19 09:25:51 PDT 2009 so there
> >>>>>>> And I can edit Capistrano's source as described above and get it to
> >>>>>>> work.
> >>>>>>> There is something going on with Capistrano's escaping of the
> >>>>>>> backticks that I don't understand. Why is it necessary on every
> >>>>>>> computer except mine to escape the backticks? And why, when they are
> >>>>>>> escaped on my machine, does the backticked command simply disappear
> >>>>>>> without a trace?
> >>>>>>> I can't imagine what could be so different on my machine. I realize
> >>>>>>> I'm running an old Fedora, but things like backticks and shell escape
> >>>>>>> characters haven't changed in 25 years.
> >>>>>>> On 19 May, 08:10, Lee Hambley<[email protected]>        wrote:
> >>>>>>>> Scott,
> >>>>>>>> Hate to respond with a classic `worksforme` -- may it be that your 
> >>>>>>>> user
> >>>>>>>> (humor me) doesn't have access to do any of the things you are 
> >>>>>>>> asking, try
> >>>>>>>> something like run('touch `echo date`') or similar.
> >>>>>>>> To save potential email formatting issues, please post the code, 
> >>>>>>>> output and
> >>>>>>>> error all in a gist/pastie and post us the links.
> >>>>>>>> - Lee
> >>>>>>>> 2009/5/19 Scott Johnson<[email protected]>
> >>>>>>>>> No difference. Not only is the output of the backticked command not
> >>>>>>>>> getting into the string, the command itself is never being run. I 
> >>>>>>>>> can
> >>>>>>>>> replace the command with `touch file.txt` and that file is never
> >>>>>>>>> created.
> >>>>>>>>> On 19 May, 01:26, Lee Hambley<[email protected]>        wrote:
> >>>>>>>>>> Try,
> >>>>>>>>>> task :foo, :hosts =>        "my.host.com" do
> >>>>>>>>>>      run "echo date is `cat /bin/date` so there"
> >>>>>>>>>> end
> >>>>>>>>>> 2009/5/19 Scott Johnson<[email protected]>
> >>>>>>>>>>> I have a run command that uses shell backticks, yet the command 
> >>>>>>>>>>> in the
> >>>>>>>>>>> backticks never runs and I get an empty string instead of the 
> >>>>>>>>>>> output
> >>>>>>>>>>> of the command.
> >>>>>>>>>>> My Capfile:
> >>>>>>>>>>> task :foo, :hosts =>        "my.host.com" do
> >>>>>>>>>>>      run "echo date is `/bin/date` so there"
> >>>>>>>>>>> end
> >>>>>>>>>>> Output from running 'cap foo':
> >>>>>>>>>>>      * executing 'foo'
> >>>>>>>>>>>      * executing "echo date is `/bin/date` so there"
> >>>>>>>>>>>        servers: ["my.host.com"]
> >>>>>>>>>>>        [my.host.com] executing command
> >>>>>>>>>>>      ** [out :: my.host.com] date is  so there
> >>>>>>>>>>>        command finished
> >>>>>>>>>>> Bizarre.
> >>>>>>>>>>> I'm running cap 2.5.5 on Fedora Core release 6 with Ruby 1.8.7. 
> >>>>>>>>>>> The
> >>>>>>>>>>> local and remote machine are the same (ie, I'm launching cap from
> >>>>>>>>>>> my.host.com).
> >>>>>>>>>>> If I edit line 212 of lib/capistrano/command.rb (that escapes 
> >>>>>>>>>>> certain
> >>>>>>>>>>> special characters in the command) and remove the backtick from 
> >>>>>>>>>>> the
> >>>>>>>>>>> gsub args, it works. But I somehow doubt this is the proper 
> >>>>>>>>>>> solution,
> >>>>>>>>>>> since I seem to be the only one having this problem.
--~--~---------~--~----~------------~-------~--~----~
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at http://groups.google.com/group/capistrano
-~----------~----~----~----~------~----~------~--~---

Reply via email to