Nesse caso, você pode ignorar o problema de citação passando o script sed na entrada padrão. O SSH roteia a entrada padrão local para o processo remoto, o sudo apenas o deixa aberto e o sed pode ler seu script no stdin. Você pode passar conteúdo para stdin com um documento aqui .
for i in 'cat hosts'; do
ssh "$i" 'sudo sed -f - …' <<'EOF'
s/( upload_server = ).*/("$a", 10051)/g
EOF
done
Mais genericamente, você pode passar um trecho de código em stdin através de SSH sem se preocupar em citar, contanto que você não precise passar dados em stdin.
for i in 'cat hosts'; do
ssh "$i" sudo sh <<'EOF'
sed 's/( upload_server = ).*/("$a", 10051)/g' …
EOF
done
Não está claro, com base na sua pergunta, se você deseja inserir "$a"
no arquivo de configuração ou "something"
, em que o valor da variável a
no shell local é something
. Se você quiser se referir à variável local, use um documento aqui com interpolação e proteja $\'
no documento here com barras invertidas. Observe que, devido à análise por sed e pelo shell remoto no segundo snippet, o valor da variável não deve conter nenhum dos caracteres \/'
ou newline.
ssh "$i" sudo sh <<EOF
sed 's/( upload_server = ).*/\1("$a", 10051)/g' …
EOF