我正在使用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 远程运行命令,而不是在本地。我不想使用第二种选择,因为它需要我手动输入密码。
我想知道出了什么问题。
如果您实际上不需要分配伪终端,请从
-t
中删除 ssh
选项。由于远程端认为它已连接到真正的 tty,因此它会发送额外的控制字符(^M
,又名回车符),这通常有助于终端显示,但由于您将输出转储到文件中,因此您只是从字面上捕捉这些字符。