Crie um diretório na Área de Trabalho Remota com uma função bash

0

Eu tenho essa função para conectar a uma Área de Trabalho Remota através do SSH e executar algumas ações lá, mas não consigo descobrir a sintaxe e se é possível fazer isso.

#Simple example
simple () {
ssh $1 "cd /home/ubuntu/Desktop; var=/home/ubuntu/Desktop/$2; mkdir $var; cd $var; pwd";
}

Quando executo o script acima, recebo um erro missing operand Try 'mkdir --help' for more information. /home/ubuntu

O que eu quero fazer é conectar-se à Área de Trabalho Remota, criar um novo diretório /home/ubuntu/$2 , copiar para ele e imprimi-lo.

P.S. Desculpe por isso, esqueci de mencionar que haverá outro argumento posicional.

    
por thanasissdr 06.10.2017 / 16:40

2 respostas

3

A string inteira "cd /home/ubuntu/Desktop; var=/home/ubuntu/Desktop/abcd; mkdir $var; cd $var; pwd" é expandida lado do cliente, antes de ser enviado para o host remoto. No cliente ambiente, var não está definido, fazendo com que $var se expanda para o espaço vazio string e, por sua vez, fazendo com que os comandos executados no host remoto sejam mkdir e cd , sem parâmetro.

Uma correção simples é citar a sua cadeia de caracteres, forçando a expansão para acontecer no host remoto:

ssh "$1" 'cd /home/ubuntu/Desktop; var=/home/ubuntu/Desktop/abcd; mkdir $var; cd $var; pwd'

Se, no seu caso de uso real, partes da string precisarem ser expandidas lado do cliente, você pode usar aspas duplas e proteger apenas aqueles variáveis que devem ser expandidas remotamente:

ssh "$1" "cd /home/ubuntu/Desktop; var=/home/ubuntu/Desktop/abcd; mkdir \$var; cd \$var; pwd"

Existem outras maneiras de fazer isso; um dos vários estilos de heredocs provavelmente será adequado também.

    
por 06.10.2017 / 16:46
2

Outra maneira de fazer isso (Incluído na minha resposta à sua pergunta no SuperUser) é com um heredoc:

simple.func () {

    ssh ${1}@${2} <<'EOF'
    cd /home/jbutryn/test
    DIR_VAR='/home/jbutryn/test/tmp'
    mkdir "$DIR_VAR"
    cd "$DIR_VAR"
    pwd
EOF

}

Como o dhag apontou, devemos escapar de qualquer variável na máquina local para que elas sejam enviadas para a máquina remota como estão e expandidas lá. A única citação do delimitador EOF faz isso. Eu também adicionei o parâmetro $2 para o nome do host / IP. Não tenho certeza de como você estava executando a função, mas agora é simple.func [user] [hostname]

Como você precisa passar um parâmetro posicional local, é possível fazer isso:

simple.func () {

    ssh ${1} <<EOF
    cd /home/jbutryn/test
    DIR_VAR="/home/jbutryn/test/${2}"
    mkdir '$DIR_VAR'
    cd '$DIR_VAR'
    pwd
EOF

}
    
por 06.10.2017 / 16:50