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