gpt4 book ai didi

bash - 通过SSH运行多行bash命令不起作用

转载 作者:行者123 更新时间:2023-12-02 14:11:28 24 4
gpt4 key购买 nike

我需要在ssh上运行多行bash命令,所有可能的尝试都已用尽,但没有运气-

echo "3. All files found, creating remote directory on the server."
ssh -t $id@$host bash -c "'
if [[ -d ~/_tmp ]]; then
rm -rf ~/_tmp/*
else
mkdir ~/_tmp
fi
'" ;

echo "4. Sending files ..."
scp ${files[@]} $id@$host:~/_tmp/ ;

这是输出-
user@linux:/tmp$ ./remotecompile
1. Please enter your id:
user
2. Please enter the names of the files that you want to compile
(Filenames *must* be space separated):
test.txt
3. All files found, creating remote directory on the server.
Password:
Unmatched '.
Unmatched '.
Connection to host.domain.com closed.

请注意,我不想将每2-3行bash if-then-else-fi命令放入单独的文件中。

正确的做法是什么?

最佳答案

使用转义的heredoc传递其文字内容。 (不进行转义,即仅使用<<EOF,将在本地处理shell扩展-如果在远程运行的代码中使用变量,则会产生更有趣的极端情况)。

ssh "$id@$host" bash <<'EOF'
if [[ -d ~/_tmp ]]; then
rm -rf ~/_tmp/*
else
mkdir ~/_tmp
fi
EOF

如果您想传递参数,那么以一种明确正确的方式进行操作会变得更加有趣(因为涉及到两个单独的 shell 解析层),但是内置的 printf '%q'节省了一天的时间:
args=( "this is" "an array" "of things to pass" \
"this next one is a literal asterisk" '*' )
printf -v args_str '%q ' "${args[@]}"
ssh "$id@$host" bash -s "$args_str" <<'EOF'
echo "Demonstrating local argument processing:"
printf '%q\n' "$@"
echo "The asterisk is $5"
EOF

关于bash - 通过SSH运行多行bash命令不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26665307/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com