我正在使用 Macbook SSH 终端并生成 RSA 密钥对并id_rsa.pub
使用批准的权限上传远程。我可以连接远程 Apache Web 服务器。我可以创建、打开、移动、修改和初步检查可以管理网络服务器上的文件,没问题......并且不会产生错误消息。
令人惊讶的是,我无法scp
将文件夹或文档从我的桌面传输到远程服务器。我也不能从scp
远程服务器到我的桌面的文件夹或文档。每次我收到错误消息时:
标准输入:不是 tty
发scp
往或来自远程 Web 服务器的命令不适用于绝对或相对文件位置引用。
我的标准语法如下所示:
从本地主机:
scp -rp ~/Desktop/foldername username@secureremoteserver.com:~/public_html
Run Code Online (Sandbox Code Playgroud)
从远程主机:
scp -rp username@secureremoteserver.com:~/public_html/foldername ~/Desktop/
Run Code Online (Sandbox Code Playgroud)
这似乎是stdin: is not a tty
错误消息的问题。
这是怎么回事?
如果此错误阻止文件传输,我该如何解决stdin: is not a tty
?
原因是目标服务器上的登录脚本之一stty...
用于设置终端特性。该命令在没有 tty 时失败,即当您使用scp
.
解决方案是保护stty
,使其仅在存在交互式会话时运行。有很多方法可以做到这一点;以下是 bash/sh 类型 shell 的一些示例:
丑陋的:
stty ... >/dev/null 2>&1
Run Code Online (Sandbox Code Playgroud)
对我有用:
test -n "$PS1" && stty ...
Run Code Online (Sandbox Code Playgroud)
在 SE 其他地方推荐:
# Check for a bash login shell
case $- in
*i*) stty ... ;;
esac
Run Code Online (Sandbox Code Playgroud)
我不确定这对 OSX sshd 实现是否重要,但在某些系统上,当您没有 tty 时,带有 ~/ 约定的隐含主目录可能不会扩展,并且您可能会得到一些意外的结果。我知道这不是确定的事情,但请尝试使用完整路径名,而不是 ~/ 构造。