从Windows通过ssh运行远程代码的“无效字节序列”; macOS好的

时间:2018-03-17 23:17:31

标签: ruby windows macos ssh cygwin

当我从Windows计算机上运行以下内容时(通过Cygwin),我收到错误消息:

ssh bob@linux-server.com 'cd ./bin && ./script.rb'
./script.rb:2:in `gsub': invalid byte sequence in US-ASCII (ArgumentError)

从Mac上的终端运行相同的代码(上面的整个ssh行)是成功的。

这怎么可能?

这是上面名为script.rb的双行脚本:

#!/usr/bin/env ruby
File.open('/home/bob/input.txt').read.gsub(/A/, 'B')

更多信息......

清空上面的输入文件input.txtls -l input.txtstat input.txt报告的大小仍为3。正在运行file input.txt次报告UTF-8 Unicode text, with no line terminators;如果我只在input.txt中放置一个字符,则其大小变为5,而file将其报告为UTF-8 Unicode (with BOM) text

Linux服务器上的Ruby版本为2.2.7p470,RubyGems(gem --version)为2.6.11

文件input.txt由第三方程序生成(它是数据导出)。

从Windows / Cygwin / ssh执行时File.open('/home/bob/input.txt').read.encoding运行US-ASCII,从macOS / Terminal / ssh执行UTF-8

2 个答案:

答案 0 :(得分:0)

尝试在script.rb文件的第一行之后添加:

#!/usr/bin/env ruby
#encoding: utf-8
File.open('/home/bob/file.txt').read.gsub(/A/, 'B')

如果不能解决问题,请参阅此https://github.com/rubygems/rubygems/issues/863 您可能需要在Windows计算机上运行它:

LANG="${LANG%%.*}.BINARY" gem update

答案 1 :(得分:0)

这解决了我的问题。但是,我在服务器上的shell是bash,所以我使用了~/.bash_profile

  

尝试添加或编辑~/.profile文件,以便正确导出   启动新会话时的语言环境设置。

export LC_ALL=en_US.UTF-8  
export LANG=en_US.UTF-8

来源:How to get UTF-8 locale when connecting via SSH to MacOSX from PuTTY (Windows)

注意:它适用于上述两个变量。知道原因会很好。