我搜索并找到了类似的问题,但没有一个足够具体或解决我的问题。例如这个问题通过 ssh 启动远程脚本/基于终端的程序时出现错误(打开终端时出错:未知。)我没有用过,ssh
所以-t
没用。
运行 webmin,几个月来一直很顺利,但现在我收到这个错误。
基本上,当我在终端中输入 nano 或 vi 时,我会收到错误“打开终端错误:未知”。
[user@host ~]# nano
Error opening terminal: unknown.
[user@host ~]# lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 16.04.3 LTS
Release: 16.04
Codename: xenial
[user@host ~]# nano
Error opening terminal: unknown.
[user@host ~]#
如何修复在运行 webmin 的 Ubuntu 16.04.3 LTS 上出现“打开终端错误:未知。”?
新的信息:
- 当我尝试直接在服务器上运行 vi 或 nano 而不是使用 webmin 或 ssh 进行远程登录时,它可以正常工作。这可能是 webmin 的问题吗?
- 当我检查环境变量时,它说
TERM=linux
这与运行相同软件的其他服务器一致。
答案1
尝试运行 /bin/bash,我认为它将分配伪 tty
也可以尝试:
TERM=linux
然后运行 nano
答案2
答案3
我在尝试编辑 initramfs 中的文件时遇到了这个问题。这是我找到的唯一一个线程,因此我没有寻找其他修复方法,而是编写了一个 Python 脚本来制作一个可以在 initramfs 中(以及其他功能较差的终端)工作的简单文本编辑器
它非常简单,每次只显示一行,因此您可以按上下键更改行,按左右键移动光标,然后按 Enter 键保存。没什么特别的,但它似乎可以快速编辑。
它只需要 readchar 模块:python3 -m pip install readchar
#!/usr/bin/python3
#Edit a text file inside the initramfs (when other text editors don't work)
'''Compile with:
libgcc=$(find /lib -name libgcc_s.so.1 | head -n 1)
libutil=$(ldd /usr/bin/python3 | grep libutil | cut -d ' ' -f 3)
pyinstaller --onefile editfile.py --add-data="$libgcc:." --add-data="$libutil:." --hidden-import readchar
'''
import shutil, sys, readchar
'''
Allow user to edit a line of text complete with support for line wraps and a cursor | you can move back and forth with the arrow keys.
lines = initial text supplied to edit
prompt= Decoration presented before the text (not editable and not returned)
'''
def text_editor(lines=[], prompt=''):
term_width = shutil.get_terminal_size()[0] - 1
line_num = 0
if type(lines) in (list, tuple):
multiline=True
else:
multiline=False
lines=[lines]
text = list(lines[line_num])
ptr = len(text)
prompt = list(prompt)
space = [' ']
c = 0
while True:
if ptr and ptr > len(text):
ptr = len(text)
copy = text.copy()
if ptr < len(text):
copy.insert(ptr,'|')
copy = list(str(line_num)) + space + prompt + copy
#Line wraps support:
if len(copy) > term_width:
cut = len(copy) + 3 - term_width
if ptr > len(copy) / 2:
copy = ['<']*3 + copy[cut:]
else:
copy = copy[:-cut] + ['>']*3
print('\r'*term_width+''.join(copy), end=' '*(term_width-len(copy)), flush=True)
if c in (53,54):
#Page up/down bug
c = readchar.readkey()
if c == '~':
continue
else:
c = readchar.readkey()
if len(c) > 1:
#Control Character
c = ord(c[-1])
#Save current line on line change
if c in (53, 54, 65, 66):
lines[line_num] = ''.join(text)
if c == 65: #Up
line_num -= 1
elif c == 66: #Down
line_num += 1
elif c == 68: #Left
ptr -= 1
elif c == 67: #Right
ptr += 1
elif c == 54: #PgDn
line_num += 10
elif c == 53: #PgUp
line_num -= 10
elif c == 70: #End
ptr = len(text)
elif c == 72: #Home
ptr = 0
else:
print("\nUnknown control character:", c)
print("Press ctrl-c to quit.")
continue
if ptr < 0:
ptr = 0
if ptr > len(text):
ptr = len(text)
#Check if line changed
if c in (53, 54, 65, 66):
if multiline == False:
line_num = 0
continue
if line_num < 0:
line_num = 0
while line_num > len(lines) - 1:
lines.append('')
text = list(lines[line_num])
else:
num = ord(c)
if num in (13, 10): #Enter
print()
lines[line_num] = ''.join(text)
if multiline:
return lines
else:
return lines[0]
elif num == 127: #Backspace
if text:
text.pop(ptr-1)
ptr -=1
elif num == 3: #Ctrl-C
sys.exit(1)
else:
text.insert(ptr, c)
ptr += 1
#Main
if len(sys.argv) == 1:
print("Usage: ./editfile <filename>")
sys.exit(1)
f = open(sys.argv[1], 'r')
strings = f.read().split('\n')
f.close()
strings = text_editor(strings)
#Trim empty lines on end
for x in range(len(strings) -1,0, -1):
if len(strings[x]):
break
else:
strings.pop(-1)
f = open(sys.argv[1], 'w')
f.write('\n'.join(strings)+'\n')
答案4
我遇到了同样的问题,并通过以下方式解决:
sudo apt-get install rxvt-unicode