2

ssh を介してシェルに渡す前に、何かを確実にエスケープしたい場合があります。しかし、この問題がどれほど難しいように見えるかは興味があります。:-$

この関数を定義するためのより短い、またはより効率的な方法はありますか?厳密にposix準拠のシェルで動作しますか?

function sshesc () { printf "%s" "$1" | sed -e "s|'|\'\\\\\'\'|g" -e "s|^|'|" -e "s|$|'|"; }

(単純に printf の代わりに echo を使用すると、バグが発生する可能性があります。)

4

3 に答える 3

1

私の知る限り、いいえ。これは、私が見た中で最も短いシェル引用の実装です。sed に依存したくない場合は、純粋なシェルで実行できますが、その方法ははるかに冗長です (そして遅くなります)。

私が理解しているように、POSIX準拠のシェルは普遍的に利用できるわけではありません(こんにちは、Solaris!)。要件をダッシュ​​ではなくバッシュに引き上げたい場合は、次のように言うことができます。

sshesc () { printf "%q" "$1" }

(zshでも動作します!)

于 2013-01-10T04:52:22.980 に答える
1

Perlは使えますか?

これを頻繁に行う必要がある場合は、Perl モジュールNet::OpenSSHを使用すると、作業がはるかに簡単になります。

例えば:

#!/usr/bin/perl
use Net::OpenSSH;

my $ssh = Net::OpenSSH->new('host');
$ssh->error and die "ssh connection failed: " . $ssh->error;

$ssh->system('ls /*');                      # the remote shell expands '/*'

$ssh->system('echo', '* $how are you! *');  # like calling execvp(3) on the
                                            # remote machine, as if no remote
                                            # shell were involved at all
于 2011-12-12T08:54:31.593 に答える