Bash ssh 执行命令偶尔会导致 ^M

问题描述 投票:0回答:1

我正在使用bash脚本进行实验,需要在远程SSH端执行一些命令[本地和远程机器都是基于Linux的]

当我使用以下命令时[这里使用localhost作为SSH目标只是作为实验],rx_tmp.log文件每行末尾都会有一个“^M”。

ssh -t user@localhost "echo 123123 | sudo -S bash -c \"export TERM=dumb && cd /home/user/redis_research/ && make clean && make\" " &> rx_tmp.log
[sudo] password for user: rm -f *.o dpdk-rx^M
g++ -c -O3 -include rte_config.h -march=native -I/usr/local/include -I/usr/include/libnl3 main.cpp -std=c++11 -o main.o^M
In file included from main.cpp:21:^M
main.h:16:13: warning: "ETH_MQ_RX_RSS" is deprecated^M
   16 |         .mq_mode = ETH_MQ_RX_RSS,^M
      |             ^~~~~~~~~~~~~~~~~~~~~            ^M
main.h:20:13: warning: "ETH_MQ_TX_NONE" is deprecated^M
   20 |         .mq_mode = ETH_MQ_TX_NONE^M
      |             ^~~~~~~~~~~~~~~~~~~~~             ^M
main.h:25:13: warning: "ETH_RSS_IP" is deprecated^M
   25 |             .rss_hf = ETH_RSS_IP | ETH_RSS_UDP | ETH_RSS_TCP,^M
      |             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^M
main.h:25:13: warning: "ETH_RSS_UDP" is deprecated^M
   25 |             .rss_hf = ETH_RSS_IP | ETH_RSS_UDP | ETH_RSS_TCP,^M
      |             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^M
main.h:25:13: warning: "ETH_RSS_TCP" is deprecated^M
In file included from main.cpp:21:^M
main.h:456:20: warning: invalid suffix on literal; C++11 requires a space between literal and string macro [-Wliteral-suffix]^M
  456 |                    "requested:%#"PRIx64" configured:%#"PRIx64"\n",^M
      |                    ^^M
main.h:456:40: warning: invalid suffix on literal; C++11 requires a space between literal and string macro [-Wliteral-suffix]^M
  456 |                    "requested:%#"PRIx64" configured:%#"PRIx64"\n",^M
      |                                        ^^M
main.cpp:308:32: warning: invalid suffix on literal; C++11 requires a space between literal and string macro [-Wliteral-suffix]^M
  308 |         rte_exit(EXIT_FAILURE, "Cannot init port %"PRIu16 "\n", port_id);^M
      |                                ^^M
g++ -O3 -include rte_config.h -march=native -I/usr/local/include -I/usr/include/libnl3 main.o -o dpdk-rx -L/usr/local/lib/x86_64-linux-gnu -Wl,--as-needed -lrte_node -lrte_graph -lrte_flow_classify -lrte_pipeline -lrte_table -lrte_pdump -lrte_port -lrte_fib -lrte_ipsec -lrte_vhost -lrte_stack -lrte_security -lrte_sched -lrte_reorder -lrte_rib -lrte_dmadev -lrte_regexdev -lrte_rawdev -lrte_power -lrte_pcapng -lrte_member -lrte_lpm -lrte_latencystats -lrte_kni -lrte_jobstats -lrte_ip_frag -lrte_gso -lrte_gro -lrte_gpudev -lrte_eventdev -lrte_efd -lrte_distributor -lrte_cryptodev -lrte_compressdev -lrte_cfgfile -lrte_bpf -lrte_bitratestats -lrte_bbdev -lrte_acl -lrte_timer -lrte_hash -lrte_metrics -lrte_cmdline -lrte_pci -lrte_ethdev -lrte_meter -lrte_net -lrte_mbuf -lrte_mempool -lrte_rcu -lrte_ring -lrte_eal -lrte_telemetry -lrte_kvargs -lbsd -lisal_crypto -lcrypto^M

但是,如果我改用以下两个命令,“^M”就会消失:

bash -c "echo 123123 | sudo -S bash -c \"export TERM=dumb && cd /home/user/redis_research/ && make clean && make\" " &> rx_tmp.log
ssh -t user@localhost "sudo -S bash -c \"export TERM=dumb && cd /home/user/redis_research/ && make clean && make\" " &> rx_tmp.log

嗯,我不能使用第一种选择,因为实际上,我必须使用 SSH 远程运行命令,而不是在本地。我不想使用第二种选择,因为它需要我手动输入密码。

我想知道出了什么问题。

bash shell ssh carriage-return
1个回答
1
投票

如果您实际上不需要分配伪终端,请从

-t
中删除
ssh
选项。由于远程端认为它已连接到真正的 tty,因此它会发送额外的控制字符(
^M
,又名回车符),这通常有助于终端显示,但由于您将输出转储到文件中,因此您只是从字面上捕捉这些字符。

© www.soinside.com 2019 - 2024. All rights reserved.