[DRE-maint] Bug#714606: help with fixing ruby-net-ssh: can't add a new key into hash during iteration during ssh.exec
Martin Steigerwald
ms at teamix.de
Tue Apr 14 13:12:57 UTC 2015
Am Dienstag, 14. April 2015, 14:39:04 schrieb David Suarez:
> Hi,
>
> 2015-04-14 13:00 GMT+02:00 Martin Steigerwald <ms at teamix.de>:
> > Am Dienstag, 14. April 2015, 12:36:33 schrieb Martin Steigerwald:
> >> Cc'ing the bug report as well, feel free to drop the cc for discussion on mailing list.
> >> an each in session.rb, line 222.
> >>
> >>
> >> Which looks quite central to the working of ruby-net-ssh to me
> >>
> >> # This is called internally as part of #process. It dispatches any
> >> # available incoming packets, and then runs Net::SSH::Connection::Channel#process
> >> # for any active channels. If a block is given, it is invoked at the
> >> # start of the method and again at the end, and if the block ever returns
> >> # false, this method returns false. Otherwise, it returns true.
> >> def preprocess
> >> return false if block_given? && !yield(self)
> >> dispatch_incoming_packets
> >> channels.each { |id, channel| channel.process unless channel.closing? }
> >> return false if block_given? && !yield(self)
> >> return true
> >> end
> >>
> >>
> >>
> >> The calling site inside distkeys is:
> >>
> >> https://github.com/teamix/distkeys/blob/master/distkeys#L174
> >>
>
> You are right, 'channels' Hash is modified inside 'channels.each' call.
>
> > I am not sure whether it is a work-around or whether it is a valid
> > contraint to be taken into account when using ruby-net-ssh. To me it
> > feels like a work-around, but well… if it works this way.
> >
> > If you still have an idea how to fix it in ruby-net-ssh, please tell me.
>
> Seems like a valid constrain, due that the problem arise when you are
> trying to open a new channel (ssh.exec!) inside the processing block
> of the another channel (sftp.lstat) in the same ssh session.
>
> One fix could be that instead os reusing the actual ssh connection to
> open the sftp one ""@sftp = Net::SFTP::Session.new(@ssh)"", create a
> new sftp connection ""Net::SFTP.start(host, user, options)"".
Thanks.
I now just finish the sftp operation before doing the ssh.exec calls and
this appears to work. Just uploaded distkeys-1.1 to github including 1.1
debian package source. This also fixes the same for the replacing of
authorized_keys with authorized_keys-new which was racy before due to
work-arounding this issue by deleting first and then sftp.rename() which
in current ruby-net-sftp cannot overwrite a file.
This appears to work just nice. And I also documented this behavior in
the script.
Will test internally for a while and then probably reapproach with request
for sponsoring for distkeys. Maybe one day will get distkeys into Debian,
I think its quite useful, cause it can put ssh keys to hosts behind
firewalls using ssh port forwarding automatically. After Jessie release :).
As for this bug, if you think its a valid constraint, feel free to close it.
I still think it would be good to at least have this documented somewhere
with ruby-net-ssh, cause the interference between ssh and sftp calls are not
that obvious but due to a implementation detail.
But I can try to send a documentation patch upstream.
--
Martin Steigerwald | Consultant / Trainer
teamix GmbH
Südwestpark 43
90449 Nürnberg
Tel.: +49 911 30999 55 | Fax: +49 911 30999 99
mail: martin.steigerwald at teamix.de | web: http://www.teamix.de | blog: http://blog.teamix.de
Amtsgericht Nürnberg, HRB 18320 | Geschäftsführer: Oliver Kügow, Richard Müller
** Data Management Day | 29.04.2015 bei teamix **
Jetzt anmelden unter www.teamix.de/CommVault
More information about the Pkg-ruby-extras-maintainers
mailing list