GNU/Linux >> Linux の 問題 >  >> Linux

ssh がシェル スクリプト パラメータを分割しないようにする

Peter Lyons からの回答に基づいていますが、引数内で引用符を使用することもできます:

#!/bin/bash
QUOTE_ARGS=''
for ARG in "[email protected]"
do
  ARG=$(printf "%q" "$ARG")
  QUOTE_ARGS="${QUOTE_ARGS} $ARG"
done

ssh [email protected] "printf ${QUOTE_ARGS}"

これは、改行を除いて、これまでにテストしたすべてのもので機能します:

$ /tmp/wrap_printf "[-%s-]" "hello'\$t\""
[-hello'$t"-]

#!/bin/sh
QUOTE_ARGS=''
for ARG in "[email protected]"
do
  QUOTE_ARGS="${QUOTE_ARGS} '${ARG}'"
done
ssh [email protected] "${QUOTE_ARGS}"

これはスペースに対して機能します。引数に一重引用符が埋め込まれている場合は機能しません。


引用を正しく行うことはかなり難しく、bash で (一般的かつ堅牢な方法で) 行うことはほとんど不可能です。

Perl を使用する:

#!/usr/bin/perl
use Net::OpenSSH;
my $ssh = Net::OpenSSH->new('[email protected]');
$ssh->system('printf', @ARGV);

Linux
  1. Ssh – Sshサーバーにログインするためのシェルスクリプト?

  2. シェルスクリプトの予期しない動作?

  3. シェルスクリプトはどこから実行されますか?

  1. シェルからPythonスクリプトを実行する方法

  2. シェルスクリプト内から passwd コマンドを使用する

  3. Bash スクリプト:セッションをログに記録するための bash スクリプトからのスクリプト コマンドの使用

  1. シェルがSshから制御されているかどうかを検出する方法は?

  2. Bash シェル スクリプト内から Vim を開く

  3. 現在のターミナルから新しいターミナルでシェルスクリプトを実行する