简而言之:bash 中的以下命令
echo $(ssh -t pi@doctor "sudo stat -c \"%U\" /var/www/candy/example/index.html")101
给出这个结果
Connection to doctor closed.
101-data
尽管
echo $(ssh -t pi@doctor "sudo stat -c \"%U\" /var/www/candy/example/index.html")
给出
Connection to doctor closed.
www-data
为什么是这样?
背景:我正在使用这个脚本(称为ced.sh):
for ARG; do
name=${ARG##*/}
echo name=$name
path=${ARG%/*}
echo path=$path
owner=$(echo $(ssh -t $remote_user@$server "sudo stat -c \"%U\" $ARG"))
echo owner=$owner
group=$(echo $(ssh -t $remote_user@$server "sudo stat -c \"%G\" $ARG"))
echo group=$group
perms=$(echo $(ssh -t $remote_user@$server "sudo stat -c \"%a\" $ARG"))
echo perms=$perms
read -p "Gibt es einen Dienst/Server, der auf diese Datei zurückgreift (notfalls leer lassen)? " service
echo service=$service
echo "name="\"$name\" "path="\"$path/\" "owner="\"$owner\" "group="\"$group\" "perms="$perms "service="$service
done
其目的是从服务器上的文件中读取一些信息(例如所有者、组、权限),我想在本地编辑这些信息。最后一行应该产生一个可以存储在文件中的输出。
它将被重写为:
echo "name="\"$name\" "path="\"$path/\" "owner="\"$owner\" "group="\"$group\" "perms="$perms "service="$service >> "$HOME/...bla bla..."
输出如下所示:
Software/EigeneProgramme/ced.sh -p /var/www/candy/example/index.html
name=index.html
path=/var/www/candy/example
Connection to doctor closed.
owner=www-data
Connection to doctor closed.
group=www-data
Connection to doctor closed.
perms=644
Gibt es einen Dienst/Server, der auf diese Datei zurückgreift (notfalls leer lassen)? apache
service=apache
service=apacheta path="/var/www/candy/example/" owner="www-data
我不明白为什么 echo 会产生最后一行。它似乎正在写入行号。我是不是忘了转义某些内容?
答案1
对此有一个简单的解释。从远程服务器检索到的值都带有尾随回车符 ( \r
)。
你期待的是这个:
www-data101
name="index.html" path="/var/www/candy/example/" owner="www-data" group="www-data" perms=644 service=apache
但是www-data
和644
后面跟着一个回车符。如果终端仿真器将 CR 渲染为换行符,则输出将如下所示:
www-data
101
name="index.html" path="/var/www/candy/example/" owner="www-data
" group="www-data
" perms=644
service=apache
如果没有换行符,行就会重叠;点表示被覆盖的字符。
...-data
101
................. path="/var/www/candy/example/" owner="www-data
...............ta
...........
service=apache
正如您已经指出的那样,在大多数终端上它看起来像这样:
101-data
service=apacheta path="/var/www/candy/example/" owner="www-data
您可以通过将远程输出传输到来验证这一点cat -v
;回车符将显示为^M
。
ssh -t pi@doctor "sudo stat -c \"%U\" /var/www/candy/example/index.html" | cat -v
一种可能的解决方案是通过管道传输远程输出来去掉回车符tr -d '\r'
:
ssh -t pi@doctor "sudo stat -c \"%U\" /var/www/candy/example/index.html" | tr -d '\r'