Conexión al sistema Linux de destino en Visual Studio

La compatibilidad con Linux está disponible en Visual Studio 2017 y versiones posteriores.

Puede configurar un proyecto de Linux que tenga como destino una máquina remota o el subsistema Windows para Linux (WSL). Para las máquinas remotas y para WSL, debe configurar una conexión remota en Visual Studio 2017.

Puede configurar un proyecto de Linux que tenga como destino una máquina remota o el subsistema Windows para Linux (WSL). Para una máquina remota, debe configurar una conexión remota en Visual Studio. Para conectarse a WSL, vaya directamente a la sección Conexión a WSL.

Si se usa una conexión remota, Visual Studio crea proyectos de C++ para Linux en la máquina remota. No importa si es una máquina física, una máquina virtual en la nube o WSL. Para crear el proyecto, Visual Studio copia el código fuente en el equipo Linux remoto. A continuación, el código se compila según la configuración de Visual Studio.

Nota

A partir de Visual Studio 2019, versión 16.5, también se admiten conexiones criptográficas compatibles con el Estándar federal de procesamiento de información (FIPS) 140-2 para sistemas Linux de desarrollo remoto. Para usar una conexión compatible con FIPS, siga los pasos que se describen en Configuración del desarrollo de Linux remoto seguro compatible con FIPS en su lugar.

Configuración del servidor SSH en el sistema remoto

Si ssh todavía no está configurado y en ejecución en el sistema Linux, siga estos pasos para instalarlo. En los ejemplos de este artículo se usa Ubuntu 18.04 LTS con el servidor OpenSSH, versión7.6. No obstante, las instrucciones deben ser iguales para cualquier distribución que use una versión bastante reciente de OpenSSH.

  1. En el sistema Linux, instale e inicie el servidor OpenSSH:

    sudo apt install openssh-server
    sudo service ssh start
    
  2. Si quiere que el servidor SSH se inicie automáticamente al arrancar el sistema, habilítelo mediante systemctl:

    sudo systemctl enable ssh
    

Configuración de la conexión remota

  1. En Visual Studio, elija Herramientas > Opciones en la barra de menús para abrir el cuadro de diálogo Opciones. Después, seleccione Multiplataforma > Administrador de conexiones para abrir el cuadro de diálogo Administrador de conexiones.

    Si no ha configurado anteriormente una conexión en Visual Studio, al crear el proyecto por primera vez, Visual Studio abre automáticamente el cuadro de diálogo Administrador de conexiones.

  2. En el cuadro de diálogo Administrador de conexiones, elija el botón Agregar para agregar una nueva conexión.

    Captura de pantalla del panel de opciones de Visual Studio.

    En el panel de opciones, CrossPlatform > C++ > Administrador de conexiones está seleccionado y el botón Agregar está resaltado.

    Para editar una conexión existente, elija Editar. En cualquier caso, se muestra la ventana Conectar con el sistema remoto.

    Captura de pantalla de la ventana Conectar con el sistema remoto de Visual Studio.

    En la ventana Conectar al sistema remoto, hay campos para el nombre de host, el puerto, el nombre de usuario, el tipo de autenticación y la contraseña. El puerto se establece en 22. El tipo de autenticación se establece en "Contraseña".

  3. Especifique la siguiente información:

    Entrada Descripción
    Nombre de host Nombre o dirección IP del dispositivo de destino
    Puerto Puerto en el que se ejecuta el servicio SSH, normalmente 22
    Nombre de usuario Usuario como el que se autentica
    Tipo de autenticación Se admite contraseña y clave privada
    Contraseña Contraseña para el nombre de usuario especificado
    Archivo de clave privada Archivo de clave privada creado para la conexión ssh
    Frase de contraseña Frase de contraseña usada con la clave privada seleccionada anteriormente

    No puede hacer clic en el botón Conectar hasta que se completen todos los campos necesarios y el puerto se establezca en un entero entre 1 y 65 535.

    Puede utilizar una contraseña o un archivo de claves y una frase de contraseña para la autenticación. Los archivos de clave son más seguros que el nombre de usuario y la contraseña. Si ya tiene un par de claves, puede reutilizarlo.

    Las versiones de Visual Studio anteriores a la 17.10 admiten claves de curva elíptica (EC), Rivert-Shamir-Adleman (RSA) y algoritmo de firma digital (DSA) para conexiones remotas. Debido a problemas de seguridad, las claves RSA y DSA ya no se admiten en VS 17.10 y versiones posteriores. Actualmente solo se admiten claves EC. Para crear un par de claves compatible con el administrador de conexiones, use el comando : ssh-keygen -m pem -t ecdsa -f <key-name>

    Nota:

    Si usa ssh-keygen para crear la clave privada, debe especificar el modificador -m pem; de lo contrario, Visual Studio no aceptará la clave. Si la clave privada comienza por -----BEGIN OPENSSH PRIVATE KEY-----, debe convertirla con ssh-keygen -p -f <FILE> -m pem.

  4. Seleccione el botón Conectar para intentar la conexión con el equipo remoto.

    Si la conexión se realiza correctamente, Visual Studio configura IntelliSense para usar los encabezados remotos. Para más información, consulte IntelliSense para los encabezados en sistemas remotos.

    Si la conexión falla, aparecerá una barra informativa con información sobre el error y los campos que posiblemente tenga que cambiar aparecerán perfilados en rojo.

    Captura de pantalla de la ventana Conectar con el sistema remoto de Visual Studio. Los campos de nombre de host y puerto están perfilados en rojo para indicar entradas incorrectas.

    Si usa archivos de claves para la autenticación, asegúrese de que el servidor SSH de la máquina de destino se esté ejecutando y esté configurada correctamente.

    Si tiene problemas para conectarse a WSL en localhost, consulte Solución de los problemas de conexión de localhost de WSL.

Comprobación de la clave de host

En Visual Studio, versión 16.10 o posteriores, se le pedirá que compruebe la huella digital de la clave de host cuando Visual Studio se conecte a un sistema remoto por primera vez. Es posible que esté familiarizado con este proceso si ha usado antes el cliente de línea de comandos de OpenSSH o PuTTY. La huella digital identifica el servidor. Visual Studio usa la huella digital para asegurarse de que se conecta al servidor de confianza adecuado.

La primera vez que Visual Studio establezca una nueva conexión remota, se le pedirá que acepte o deniegue la huella digital de la clave de host presentada por el servidor. O bien, siempre que haya cambios en una huella digital almacenada en caché. También puede comprobar una huella digital a petición si selecciona una conexión en el Administrador de conexiones y elije Comprobar.

Si actualiza a Visual Studio 16.10 o versiones posteriores desde una versión anterior, se tratarán las conexiones remotas existentes como nuevas conexiones. Se le pedirá que acepte primero la huella digital de la clave de host. A continuación, Visual Studio establece una conexión y almacena en caché la huella digital aceptada.

También puede actualizar las conexiones remotas desde ConnectionManager.exe mediante el argumento update.

Algoritmos SSH admitidos

A partir de la versión 16.9 de Visual Studio, se ha eliminado la compatibilidad con los algoritmos SSH anteriores y poco seguros que se usan para cifrar datos e intercambiar claves. Solo se admiten los algoritmos que se indican a continuación. Su uso se admite para la comunicación SSH entre el cliente y el servidor, en ambas direcciones:

Tipo de algoritmo Algoritmos admitidos
Cifrado aes128-cbc
aes128-ctr
aes192-cbc
aes192-ctr
aes256-cbc
aes256-ctr
HMAC hmac-sha2-256
hmac-sha2-512
Intercambio de claves diffie-hellman-group14-sha256
diffie-hellman-group16-sha512
diffie-hellman-group-exchange-sha256
ecdh-sha2-nistp256
ecdh-sha2-nistp384
ecdh-sha2-nistp521
Clave de host ecdsa-sha2-nistp256
ecdsa-sha2-nistp384
ecdsa-sha2-nistp521

Configuración del servidor SSH

En primer lugar, pongámonos en antecedentes. No se puede seleccionar el algoritmo SSH que se usará en Visual Studio. En su lugar, el algoritmo se determina durante el protocolo de enlace inicial con el servidor SSH. Cada lado (cliente y servidor) proporciona una lista de algoritmos que admite y, luego, se selecciona el primer algoritmo admitido por ambos. La conexión se realizará correctamente siempre que haya un algoritmo que admitan tanto Visual Studio como el servidor para el cifrado, HMAC, el intercambio de claves, etc.

El archivo de configuración de OpenSSH ( sshd_config ) no configura qué algoritmo se debe usar de forma predeterminada. Si no se especifica ningún algoritmo, el servidor SSH debe usar valores predeterminados seguros. Estos dependen de la versión y el proveedor del servidor SSH. Si Visual Studio no admite esos valores predeterminados, es probable que vea un error como: "No se pudo conectar con el sistema remoto. No se ha encontrado ningún algoritmo HMAC de cliente a servidor común". El error también puede aparecer si el servidor SSH está configurado para usar algoritmos que Visual Studio no admite.

En la mayoría de las distribuciones de Linux modernas, el servidor SSH predeterminado debería funcionar con Visual Studio. Sin embargo, puede que esté ejecutando un servidor SSH anterior configurado para usar algoritmos anteriores y poco seguros. En el ejemplo siguiente se explica cómo realizar la actualización a versiones más seguras.

En el ejemplo siguiente, el servidor SSH usa el algoritmo hmac-sha1 no seguro, que Visual Studio 16.9 no admite. Si el servidor SSH usa OpenSSH, puede editar el archivo /etc/ssh/sshd_config tal y como se muestra a continuación para habilitar algoritmos más seguros. En el caso de otros servidores SSH, consulte la documentación del servidor para obtener información sobre cómo configurarlo.

En primer lugar, compruebe que el conjunto de algoritmos que usa el servidor incluya algoritmos admitidos por Visual Studio. Ejecute el comando siguiente en la máquina remota para mostrar la lista de algoritmos que admite el servidor:

ssh -Q cipher; ssh -Q mac; ssh -Q kex; ssh -Q key

El comando genera una salida como:

3des-cbc
aes128-cbc
aes192-cbc
aes256-cbc
...
ecdsa-sha2-nistp521-cert-v01@openssh.com
sk-ecdsa-sha2-nistp256-cert-v01@openssh.com

La salida muestra todos los algoritmos de cifrado, HMAC, intercambio de claves y clave de host que admite el servidor SSH. Si la lista no incluye algoritmos compatibles con Visual Studio, actualice su servidor SSH antes de continuar.

Puede habilitar los algoritmos que admite Visual Studio editando /etc/ssh/sshd_config en la máquina remota. En los ejemplos siguientes, se muestra cómo agregar varios tipos de algoritmos a este archivo de configuración.

Los ejemplos se pueden agregar en cualquier parte de /etc/ssh/sshd_config. Asegúrese de que se encuentren en sus respectivas líneas.

Después de editar el archivo, reinicie el servidor SSH (sudo service ssh restart en Ubuntu) e intente realizar la conexión de nuevo desde Visual Studio.

Ejemplo de cifrado

Agregue Ciphers <algorithms to enable>.
Por ejemplo: Ciphers aes128-cbc,aes256-cbc

Ejemplo de HMAC

Agregue MACs <algorithms to enable>.
Por ejemplo: MACs hmac-sha2-256,hmac-sha2-512

Ejemplo de intercambio de claves

Agregue KexAlgorithms <algorithms to enable>.
Por ejemplo: KexAlgorithms ecdh-sha2-nistp256,ecdh-sha2-nistp384

Ejemplo de clave de host

Agregue HostKeyAlgorithms <algorithms to enable>.
Por ejemplo: HostKeyAlgorithms ecdsa-sha2-nistp256,ecdsa-sha2-nistp384

Registro de las conexiones remotas

Puede habilitar el registro para ayudar a solucionar problemas de conexión. En la barra de menús, seleccione Herramientas > Opciones. En el cuadro de diálogo Opciones, seleccione Multiplataforma > Registro:

Captura de pantalla de la pantalla de opciones de Visual Studio.

Las opciones están abiertas en Multiplataforma > Administrador de conexiones > Registro. Habilitar registro está marcado, registro en un archivo está marcado, el directorio del archivo de registro se establece en la carpeta de documentos, y el registro en el panel "Registro multiplataforma" de la ventana de salida está marcado.

Los registros incluyen las conexiones, todos los comandos enviados a la máquina remota (su texto, código de salida y tiempo de ejecución) y toda la salida de Visual Studio al shell. El registro funciona para cualquier proyecto CMake multiplataforma o proyecto Linux basado en MSBuild en Visual Studio.

Puede configurar la salida para que vaya a un archivo o al panel Registro multiplataforma en la Ventana de salida. Para proyectos Linux basados en MSBuild, los comandos de MSBuild emitidos a la máquina remota no se enrutan a la Ventana de salida porque se emiten fuera de proceso. En su lugar, se registran en un archivo con el prefijo "msbuild_".

Utilidad de línea de comandos para el Administrador de conexiones

Visual Studio 2019, versión 16.5 o posteriores: ConnectionManager.exe es una utilidad de línea de comandos para administrar conexiones de desarrollo remotas fuera de Visual Studio. Resulta útil para tareas como el aprovisionamiento de una nueva máquina de desarrollo. O bien, puede usarla para configurar Visual Studio para la integración continua. Para obtener ejemplos y una referencia completa al comando ConnectionManager, consulte Referencia de ConnectionManager.

Reenvío de puertos TCP

Tanto los proyectos de CMake como los de Linux basados en MSBuild usan el comando rsyncpara copiar encabezados de su sistema remoto en Windows, a fin de utilizarlos para IntelliSense. Si no puede habilitar el reenvío de puertos TCP, deshabilite la descarga automática de los encabezados remotos. Para deshabilitarla, vaya a Herramientas > Opciones > Multiplataforma > Administrador de conexiones > Administrador de IntelliSense de encabezados remotos. Si el sistema remoto no tiene habilitado el reenvío de puertos TCP, verá el siguiente error al comenzar la descarga de encabezados remotos para IntelliSense:

Captura de pantalla de un mensaje de error de Visual Studio que indica que no se pudo abrir el canal SSH. Se proporciona la ruta de acceso a un archivo de registro.

La compatibilidad con CMake de Visual Studio también usa rsync para copiar archivos de origen en el sistema remoto. So no puede habilitar el reenvío de puertos TCP, puede usar sftp como su método de copia de orígenes en remoto. sftp suele ser más lento que rsync, pero no depende del reenvío de puertos TCP. Puede administrar su método de copia de orígenes en remoto con la propiedad remoteCopySourcesMethod en el Editor de configuraciones de CMake. Si el reenvío de puertos TCP está deshabilitado en su sistema remoto, verá un error en la ventana de salida de CMake al invocarse rsync por primera vez.

Captura de pantalla de la ventana de salida de Visual Studio que muestra un mensaje de error Rsync.

La ventana de salida incluye estos mensajes: Compruebe que el reenvío TCP está habilitado en el servidor, rsync: no se ha visto el saludo del servidor, error rsync: error al iniciar el protocolo cliente-servidor (código 5) en main.c(1675) [sender=3.1.3], No se ha podido abrir un canal SSH.

gdbserver se puede usar para la depuración en dispositivos incrustados. Si no puede habilitar el reenvío de puertos TCP, tendrá que usar gdb para todos los escenarios de depuración remota. gdb se usa de forma predeterminada al depurar proyectos en un sistema remoto.

La compatibilidad con Linux de Visual Studio depende del reenvío de puertos TCP. rsync y gdbserver se ven afectados si el reenvío de puertos TCP está deshabilitado en su sistema remoto. Si esta dependencia le afecta, puede votar este vale de sugerencia en Developer Community.

Conexión a WSL

En Visual Studio 2017, se usan los mismos pasos para conectarse a WSL que para un equipo Linux remoto. Utilice localhost para el nombre de host.

A partir de Visual Studio 2019 versión 16.1, se incluye compatibilidad nativa para usar C++ con el Subsistema de Windows para Linux (WSL). Esto significa que puede compilar y depurar directamente en la instalación local de WSL. Ya no es necesario agregar una conexión remota ni configurar SSH. Encontrará más detalles sobre cómo instalar WSL aquí.

Para configurar la instalación de WSL de modo que funcione con Visual Studio, es necesario tener instaladas las herramientas gcc o clang, gdb, make, ninja-build (solo necesario para los proyectos de CMake que usan Visual Studio 2019, versión 16.6 o posteriores), rsync y zip. Puede instalarlos en distribuciones que usan apt mediante este comando, que también instala el compilador g++:

sudo apt install g++ gdb make ninja-build rsync zip

Solución de los problemas de conexión de localhost de WSL

Al conectarse a Subsistema de Windows para Linux (WSL) en localhost, puede encontrarse con un conflicto con el cliente ssh de Windows en el puerto 22. En WSL, cambie el puerto desde el que ssh espera solicitudes a 23 en /etc/ssh/sshd_config:

Port 23

Si se va a conectar con una contraseña, asegúrese de que lo siguiente está establecido en /etc/ssh/sshd_config:

# To disable tunneled clear text passwords, change to no here!
PasswordAuthentication yes

Después de realizar estos cambios, reinicie el servidor SSH (sudo service ssh restart en Ubuntu).

A continuación, vuelva a intentar la conexión a localhost con el puerto 23.

Para más información, vea Descargar, instalar y configurar la carga de trabajo de Linux.

Para configurar un proyecto de MSBuild para WSL, consulte Configuración de un proyecto de Linux. Para configurar un proyecto de CMake para WSL, consulte Configuración de un proyecto de CMake en Linux. Para seguir las instrucciones paso a paso para crear una aplicación de consola sencilla con WSL, consulte esta entrada introductoria del blog sobre C++ con Visual Studio 2019 y el subsistema de Windows para Linux (WSL).

Consulte también

Configuración de un proyecto de Linux
Configuración de un proyecto de CMake en Linux
Implementación, ejecución y depuración del proyecto de Linux
Configuración de sesiones de depuración de CMake